20190918 - 纪念

918……

预审:

T1

枚举子集???3^N

T2

16MB……像数学题……A是开不下的……

总之T2是只能开个M的数组

T3

反复亦或的话……没想法

过程:

T1

先$mod$一下$n$

然后排个序?

有$0$直接出,要不两头扫

仿佛对

先考虑更靠近$0,N$的

用另一个去填。

仿佛出锅了……

目前仿佛是:

    在有序的数组里前缀和可以得出正确的ans

    目前来看,仿佛无解还真做不到……

    无论如何都有解?

    于是又无聊写了单调栈……

证明:

前缀和在mod n 意义下有n种情况

1. 有 0,直接输出

2. 无 0,则还剩n-1 种情况,由抽屉原理可知必有至少两个相等.

于是一定有一个合法区间。

    故此题一定有解。

    (于是也可以 O(N) 过了)

    马上改桶,单调栈爆了……

    又快又好QwQ

关于对拍:

写个××暴力,写spj就可以了啊=。=

附一个用 fstream 和 mt19937 写的,要开C++11编译……

#include <bits/stdc++.h>
#define N 100000
#define M 1111111
using namespace std;
int arr[M],nn,an;
bool che[M];
mt19937 rr(time(0));
bool check(){
	fstream dat;
	dat.open("1.in",ios_base::in);
	dat>>nn;
	for(int i=1;i<=nn;i++){
		dat>>arr[i];
	}
	dat.close();
	fstream ans;
	ans.open("1.out",ios_base::in);
	ans>>an;
	if(an==-1){
		cout<<"-1-1-1-1-1-1-1-1-1-1-"<<endl;
		exit(0);
	}
	int ansc=0,b;
	memset(che,0,sizeof che);
	for(int i=1;i<=an;i++){
		ans>>b;
		if(che[b]==1)return 0;
		ansc+=arr[b];
		che[b]=1;
		ansc%=nn;
	}
	return ansc==0;
}
void Ran(){
	fstream ran;
	ran.open("1.in",ios_base::out);
	int n=10000;
	ran<<n<<endl;
	for(int i=1;i<=n;i++)
		ran<<int(rr()%1000000000+1)<<" ";
	ran.close();
}
int main(){
	int T=N;
	while(T--){
		Ran();
		system("time ./T");
		if(!check()){
			puts("WA----------------QnQ");
			return 0;
		}
		cout<<T<<"/"<<N;puts("AcA QvQ");
	}
}
/*
g++ dp.cxx -o dp
g++ T1.cpp -o T
ls
./dp
*/

 

T2

$A[i]=X[i]*pow(Y[i],count[i])+Z[i]+Y[i]*Z[i]+...+pow(Y[i],count[i]-1)*Z[i] \mod {2^{K-1}}$

后面就可以提一个$Z[i]$,然后用$(1-Y[i]^n)*1/1-Y[i] \text{     }or \text{     } nY[i]$求……

做到了$\log$求$A$?

维护$count$前缀和?

一波乱搞,

发现前两个$subtask$可以开出来$A$

hiahiahia

然后一波容斥判断。

T3

只会暴力,10%

结果:

14
Miemeng 100
03:13:30
0
03:17:12
10
03:13:43
110
03:17:12
posted @ 2019-09-19 11:40  Miemeng_麦蒙  阅读(180)  评论(0编辑  收藏  举报

小麦在雨中,蒙蒙的雾气

麦蒙不想有人骚扰他,如果有必要 联系 QQ:1755601414

如果你嫌广告大,那就喷我吧,不是博客园的锅。