Codeforces Round 1095 (Div. 2) 补题
C. Mental Monumental (Easy Version)自己的思路打表发现一个数的余数可以是 [ 0 , (x-1)/2 ] U {x}维护一个suf数组去二分答案但是发现无法兼顾两种贡献方式遂没写出来两种贡献1.x2.[0,(x-1)/2]正解在二分ck中维护一个suf以及st数组将两种贡献方式分开一个数如果x在0到mid那么就留一个当x剩下的充当第二种贡献如果大于x那么直接扔去当第二种一个都不需要给x自己留留一个x本质是一种贪心肯定越大的数越不好凑越稀有那么x按第一种贡献肯定比第二种要优上代码#includebits/stdc.h #define int long long #define fi first #define se second #define endl \n using namespace std; const int mod1e97; typedef pairint,intpii; const int N3e5; int dx[4]{1,-1,0,0}; int dy[4]{0,0,1,-1}; int num[N],inv[N];//阶乘以及阶乘的逆元 //ansnum[a]*inv[a-b]%mod*inv[b]%mod; int kmi(int a,int b){ int res1; while(b){ if(b1)resres*a%mod; b1; aa*a%mod; } return res; } void init(){ num[0]1,inv[0]1; for(int i1;i2e5;i){//预处理出2e5内的阶乘以及其逆元 num[i]num[i-1]*i%mod; inv[i]kmi(num[i],mod-2); } } void solve(){ int n;cinn; vectorintcnt(n10),a(n10); for(int i1;in;i){ cina[i]; } auto ck[](int mid)-bool{ vectorintst(n10),suf(n10); for(int i1;in;i){ if(a[i]mid!st[a[i]]) st[a[i]]1; else suf[min(mid,max(0LL,(a[i]-1)/2))]; } int need0; for(int in-1;i0;i--) suf[i]suf[i1]; for(int imid;i0;i--){ if(st[i]) continue; need; if(needsuf[i]) return 0; } return 1; }; int l0,rn-1; int ans0; while(lr){ int midlr1; if(ck(mid)) lmid1,ansmid; else rmid-1; } coutans1; } signed main(){ ios_base::sync_with_stdio(false); cin.tie(0),cout.tie(0); int T1;cinT; while(T--){ solve(); coutendl; } return 0; }
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2570204.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!