[考试总结]noip模拟21

中位数要排序!!!!!!

中位数要排序!!!!!!

中位数要排序!!!!!!

中位数要排序!!!!!!

中位数要排序!!!!!!

分差不加绝对值!!!!

分差不加绝对值!!!!

分差不加绝对值!!!!

分差不加绝对值!!!!

分差不加绝对值!!!!

  • 如果你在考场的时候发现了这个秘密,那么你至少 \(rk3\)

然而并没有

两个秘密都没有发现,然后成功获得了了 \(12pts\)高分

\(\huge{\text{果然连胜之后必是连败}}\)

战神除外

考场的时候心态不够稳定,在发现 \(T1\) 的样例死活出不来的时候心态炸裂。

$n = 100 $ 的数据硬生生手摸。。

三个小时之后心态炸裂。

\(20min\)迅速打完暴力

拿到 \(12pts\) 高分

本以为 \(T2\; \mathcal O(nlog(n))\) 的做法有 \(50pts\)

结果。。。。

这个题目的分差没有绝对值???!!!

就问您你能看出来不加绝对值???

我连谁做被除数都不知道

生气。。。

不提了。。。。

Median:

本以为这个题目带上线性筛 \(mathcal O(n)\) 可过

然而我连中位数是什么都不知道。。。

他是需要排序的!!!!!!!!!!!!!!!!!

然后三个小时都败在这个上面了。。。

痛苦。。。

他给出的 \(s_1\) 序列实际上就是随机数序列。。。。

所以使用类似莫队的方法就能搞掉

虽然复杂度最劣 \(n^2\)



#include<bits/stdc++.h>
using std::cout; using std::endl;
#define debug cout<<"debug"<<endl
namespace xin_io
{
	#define gc() p1 == p2 and (p2 = (p1 = buf) + fread(buf,1,1<<20,stdin),p1 == p2) ? EOF : *p1++
	char buf[1<<20],*p1 = buf,*p2 = buf; FILE *xinnb1; typedef long long ll;
	void openfile() {xinnb1 = freopen("t.txt","r",stdin);} void outfile() {xinnb1 = freopen("o.txt","w",stdout);}
	inline int get()
	{
		int s = 0,f = 1; register char ch = gc();
		while(!isdigit(ch)) {if(ch == '-') f = -1; ch = gc();}while(isdigit(ch))  {s = s * 10 + ch - '0'; ch = gc();}
		return s * f;
	}
}
using namespace xin_io; static const int maxn = 1e7+10;
#define try(i,a,b) for(register signed i=a;i<=b;++i)
#define throw(i,a,b) for(register signed i=a;i>=b;--i)
namespace xin
{
	//#define int long long
	ll s1[maxn],cnt,s2[maxn],zhi;
	int n,k,w;
	inline bool pr(int x)
	{
		for(register int i=2;i*i<=x;++i)
			if(x % i == 0)
				return false;
		return true;
	}
//	double ans = 0;
//	bool number[maxn*100];
	std::bitset<maxn*100>number;
	int prime[maxn],count = 0;
	void shai(int N)
	{
		int i,j;
//		memset(number,true,sizeof(number));
		number.set();
		for(i=2;i<=N;i++)
		{
		    if(number[i]) prime[count++]=i;
			if(count >= maxn-9) return ;
		    for(j=0;j<count and prime[j]*i<=N;j++)
		    {
		        number[prime[j]*i]=false;
		        if(i%prime[j]==0)
		            break;
		    }
		}
	}
	#define int long long
	int zhuan[maxn];
	int vis[maxn];
	inline short main()
	{
	#ifndef ONLINE_JUDGE
		openfile();
	#endif
		std::cin>>n>>k>>w;
		register int i = 2;
		const int MAX = 1.8e8;
		shai(MAX);
		for(register int i=2;cnt<=n;++i)
			if(number[i]) s1[++cnt] = i * cnt % w;	
		try(i,1,n)
			zhuan[i] = s2[i] = s1[i] + s1[(i / 10) + 1];//,cout<<"i = "<<i<<" s2[i] = "<<s2[i]<<endl;
		int sum = 0,num = 0;
		double ans = 0.0;
		try(i,1,k-1) vis[s2[i]]++;
		if(k & 1) // ji
		{
			register int zhi = 0,ret = -1,len = (k >> 1) + 1;
			try(i,k,n)
			{
				vis[s2[i]]++;
				if(s2[i] <= ret) ++zhi;
				if(i xor k)
				{
					vis[s2[i-k]]--;
					if(s2[i-k] <= ret) zhi--;
				}
				while(zhi < ((k >> 1) + 1)) zhi += vis[++ret];
				while(zhi >= len + vis[ret]) zhi -= vis[ret--];
				ans += ret;
			}
		}
		else
		{
			register int zhi1 = 0,zhi2 = 0,ret1 = -1,ret2 = -1,len = (k >> 1);
			try(i,k,n)
			{
				vis[s2[i]]++;
				if(s2[i] <= ret1) zhi1++;
				if(s2[i] <= ret2) zhi2++;
				if(i xor k)
				{
					vis[s2[i-k]]--;
					if(s2[i-k] <= ret1) zhi1--;
					if(s2[i-k] <= ret2) zhi2--;
				}
				while(zhi1 < len) zhi1 += vis[++ret1];
				while(zhi2 < len + 1) zhi2 += vis[++ret2];
				while(zhi1 >= len + vis[ret1]) zhi1 -= vis[ret1--];
				while(zhi2 >= len + vis[ret2] + 1) zhi2 -= vis[ret2--];
				ans += (1.0 * ret1 + 1.0 * ret2) / 2.0;
			}
		}
		printf("%.1lf\n",ans);
		return 0;
	}
}
signed main() {return xin::main();}

Game:

一眼优先队列。

然后加上谜之读题有 \(50pts\)

正解是维护一个单调不增的指针,然后他的复杂度均摊 \(k\)

之后就可以 \(\mathcal O(nk)\) 通过



#include<bits/stdc++.h>
using std::cout; using std::endl;
#define debug cout<<debug<<endl
//#define int long long
namespace xin_io
{
	#define gc() p1 == p2 and (p2 = (p1 = buf) + fread(buf,1,1<<20,stdin),p1 == p2) ? EOF : *p1++
	char buf[1<<20],*p1 = buf,*p2 = buf; FILE *xinnb1; typedef long long ll;
	void openfile() {xinnb1 = freopen("t.txt","r",stdin);} void outfile() {xinnb1 = freopen("o.txt","w",stdout);}
	inline int get()
	{
		int s = 0,f = 1; register char ch = gc();
		while(!isdigit(ch)) {if(ch == '-') f = -1; ch = gc();}while(isdigit(ch))  {s = s * 10 + ch - '0'; ch = gc();}
		return s * f;
	}
}
using namespace xin_io; static const int maxn = 1e6+10,inf = 0x3f3f3f3f;
#define try(i,a,b) for(register signed i=a;i<=b;++i)
#define throw(i,a,b) for(register signed i=a;i>=b;--i)
namespace xin
{
	int n,k;
	int a[maxn],vis[maxn];
	inline short main()
	{
	#ifndef ONLINE_JUDGE
		openfile();
	#endif
		n = get(); k = get();
		try(i,1,n) a[i] = get();
		try(que,1,k)
		{
			register int num = get();
			ll maxx = -inf,alice = 0,bob = 0,cnt = num - 1;
			try(i,1,num-1) vis[a[i]]++,maxx = std::max(a[i] * 1ll,maxx); 
			try(i,1,n)
			{
				register int newval = 0;
				if(++cnt <= n) newval = a[cnt];
				if(newval >= maxx) {(i & 1) ? alice += newval : bob += newval; continue;}
				else vis[newval]++;
				(i & 1) ? alice += maxx : bob += maxx; vis[maxx]--;
				throw(j,maxx,1) if(vis[j]) {maxx = j; break;}
			}
			printf("%lld\n",(alice - bob));
		}
		return 0;
	}
}
signed main() {return xin::main();}

Park:

posted @ 2021-07-21 13:57  NP2Z  阅读(39)  评论(0编辑  收藏  举报