这场edu有点简单……

所以题目可能也有点奇奇怪怪的。

A.随意构造一下,可以发现只有当填满都不行时才可能无解。

#include<bits/stdc++.h>
using namespace std;
int n,k,a[][];
inline int read(){
int f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
}
int main(){
n=read();k=read();
if(n*n<k){puts("-1");return ;}
for(int i=;i<=n&&k;i++){
a[i][i]=;
if(k==)break;
k--;
for(int j=i+;j<=n&&k>;j++)a[i][j]=a[j][i]=,k-=;
}
for(int i=;i<=n;i++){
for(int j=;j<=n;j++)printf("%d ",a[i][j]);
puts("");
}
}

B.扫一遍就行了……

#include<bits/stdc++.h>
#define N 200005
using namespace std;
vector<int> b;
int a[N];int n,now=;
inline int read(){
int f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
}
int main(){
n=read();
for(int i=;i<=n;i++){
a[i]=read();if(a[i]==)b.push_back(i);
}
for(int i=;i<=n;i++){
if(now+<b.size()&&abs(b[now]-i)>abs(b[now+]-i))++now;
printf("%d ",abs(i-b[now]));
}
}

C.当时想出了倍数构造,但是有一点死活过不去……
加了个极大值特判过了……

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,k,ans=,m;
int main(){
ios::sync_with_stdio(false);
cin>>n>>k;
m=n/(k*(k+)/);
if(!m||k>){puts("-1");return ;}
for(ll j=;j*j<=n;j++){
if(n%j==){
if(j<=m&&j>ans)ans=j;if(n/j<=m&&(n/j)>ans)ans=n/j;
}
}
for(int i=;i<k;i++)cout<<i*ans<<' ';
n-=ans*(k-)*k/;
cout<<n<<endl;
}

D.答案显然可以二分。那么二分判断下是否可行就行。

#include<bits/stdc++.h>
#define N 1000010
using namespace std;
int n,m,k,a[N];
char s[N];
inline bool check(int x){
int lx=,ans=;
for(int i=;i<=m;i++)if(a[i]-a[lx]>x)lx=i-,++ans;
return ans>k;
}
int main(){
int maxl=;
scanf("%d\n",&k);gets(s+);n=strlen(s+);s[n]=' ';
for(int i=;i<=n;i++){
if(s[i]=='-'||s[i]==' '){a[++m]=i;maxl=max(maxl,i-a[m-]);}
}
int l=maxl,r=n;
while(l<=r){
int mid=(l+r)>>;
if(check(mid))l=mid+;
else r=mid-;
}
printf("%d\n",l);
}

E.题解给了个带log的dp,被我记忆化水过去了……

#include<bits/stdc++.h>
using namespace std;
long long n,k;string s;
bool dp[][];
bool dfs(int u,int v){
if(u==n&&abs(v)==k)return ;
if(u==n||abs(v)>=k)return ;
if(dp[u][v])return ;
dp[u][v]=;
if(s[u]=='W')return dfs(u+,v+);
if(s[u]=='D')return dfs(u+,v);
if(s[u]=='L')return dfs(u+,v-);
if(dfs(u+,v+)){s[u]='W';return ;}
if(dfs(u+,v)){s[u]='D';return ;}
if(dfs(u+,v-)){s[u]='L';return ;}
return ;
}
int main(){
cin>>n>>k;cin>>s;
if(!dfs(,))puts("NO");
else cout<<s<<endl;
}

F.按照题解的式子推一样的,具体看官方题解吧。

#include<bits/stdc++.h>
#define N 1000005
#define yql 1000000007
using namespace std;
const int lim=1e5+;
int n,cnt[N],a[N],ans[N],p[N];
inline int read(){
int f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
}
int main(){
p[]=;for(int i=;i<=lim;i++)p[i]=(p[i-]<<)%yql;
n=read();
for(int i=;i<=n;i++)a[read()]++;
for(int i=;i<=lim;i++)for(int j=i+i;j<=lim;j+=i)a[i]+=a[j];
for(int i=lim;i;i--){
ans[i]=p[a[i]]-;
for(int j=i+i;j<=lim;j+=i){
ans[i]-=ans[j];
if(ans[i]<)ans[i]+=yql;
}
}
printf("%d\n",ans[]);
}

G.用动态开点线段树维护ST表(辣鸡cf怎么这么喜欢动态开点)

有点问题留坑待补。

#include<bits/stdc++.h>
#define N 100005
#define M 10000005
#define inf 2147483640
using namespace std;
int n,m,q,a[N],st[][N],lg[N];
int tagv[M],val[M],ls[M],rs[M],cnt=,mn=2e9;
inline int rmq(int l,int r){
int len=r-l+,t=lg[len];
return min(st[t][l],st[t][(r-<<t)+]);
}
inline int query(int l,int r){
int len=r-l+;if(len>=n)return mn;
if((l-)/n==(r-)/n)return rmq((l-)%n+,(r-)%n+);
else return min(rmq((l-)%n+,n),rmq(,(r-)%n+));
}
inline void pushup(int o,int l,int r){
if(~tagv[o])val[o]=tagv[o]?tagv[o]:query(l,r);
else val[o]=min(val[ls[o]],val[rs[o]]);
}
inline void pushdown(int o,int l,int r){
if(!ls[o])ls[o]=++cnt;if(!rs[o])rs[o]=++cnt;
if(~tagv[o]){
int mid=(l+r)>>;
tagv[ls[o]]=tagv[o];pushup(ls[o],l,mid);
tagv[rs[o]]=tagv[o];pushup(rs[o],mid+,r);
}
}
void change(int o,int l,int r,int ql,int qr,int v){
if(ql<=l&&r<=qr){tagv[o]=v;return;}
int mid=(l+r)>>;pushdown(o,l,r);tagv[o]=-;
if(ql<=mid)change(ls[o],l,mid,ql,qr,v);
if(qr>mid)change(rs[o],mid+,r,ql,qr,v);
pushup(o,l,r);
}
int query(int o,int l,int r,int ql,int qr){
if(ql<=l&&r<=qr)return val[o];
int mid=(l+r)>>;pushdown(o,l,r);
int ans=inf;
if(ql<=mid)ans=min(ans,query(ls[o],l,mid,ql,qr));
if(qr>mid)ans=min(ans,query(rs[o],mid+,r,ql,qr));
return ans;
}
inline int read(){
int f=,x=;char ch;
do{ch=getchar();if(ch=='-')f=-;}while(ch<''||ch>'');
do{x=x*+ch-'';ch=getchar();}while(ch>=''&&ch<='');
return f*x;
}
inline void initrmq(){
for(int j=;j<;++j)for(int i=;i<=n;++i)
if(i+(<<j)-<=n)st[j][i]=min(st[j-][i],st[j-][i+(<<j-)]);
}
int main(){
n=read();m=read();
for(int i=;i<=n;i++){
a[i]=read();mn=min(mn,a[i]);st[][i]=a[i];
}
for(int i=;i<=n;++i)lg[i]=lg[i>>]+;
initrmq();
q=read();pushup(,,n*m);
while(q--){
int opt=read(),l=read(),r=read();
if(opt==){
int v=read();change(,,n*m,l,r,v);
}
else printf("%d\n",query(,,n*m,l,r)); }
return ;
}

【Educational Codeforces Round20】的更多相关文章

  1. 【Educational Codeforces Round28】

    咸鱼选手发现自己很久不做cf了,晚节不保. A.Curriculum Vitae 枚举一下间断点的位置. #include<bits/stdc++.h> using namespace s ...

  2. 【Educational Codeforces Round 38 (Rated for Div. 2)】 Problem A-D 题解

    [比赛链接] 点击打开链接 [题解] Problem A Word Correction[字符串] 不用多说了吧,字符串的基本操作 Problem B  Run for your prize[贪心] ...

  3. 【 Educational Codeforces Round 51 (Rated for Div. 2) F】The Shortest Statement

    [链接] 我是链接,点我呀:) [题意] [题解] 先处理出来任意一棵树. 然后把不是树上的边处理出来 对于每一条非树边的点(最多21*2个点) 在原图上,做dijkstra 这样就能处理出来这些非树 ...

  4. 【Educational Codeforces Round 53 (Rated for Div. 2) C】Vasya and Robot

    [链接] 我是链接,点我呀:) [题意] [题解] 如果|x|+|y|>n 显然.从(0,0)根本就没法到(x,y) 但|x|+|y|<=n还不一定就能到达(x,y) 注意到,你每走一步路 ...

  5. 【Educational Codeforces Round 48 (Rated for Div. 2) C】 Vasya And The Mushrooms

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 显然在没有一直往右走然后走到头再往上走一格再往左走到头之前. 肯定是一直在蛇形走位.. 这个蛇形走位的答案贡献可以预处理出来.很容易 ...

  6. 【Educational Codeforces Round 48 (Rated for Div. 2) D】Vasya And The Matrix

    [链接] 我是链接,点我呀:) [题意] 告诉你每一行.每一列的异或和. 让你求出一个符合要求的原矩阵. [题解] 显然应该有 a1^a2^....^an = b1^b2^....^bn 也即两边同时 ...

  7. 【Educational Codeforces Round 41 (Rated for Div. 2) D】Pair Of Lines

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 如果点的个数<=3 那么直接输出有解. 否则. 假设1,2最后会在一条直线上,则把这条直线上的点都删掉. 看看剩余的点是否在同 ...

  8. 【Educational Codeforces Round 37 F】SUM and REPLACE

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 那个D函数它的下降速度是很快的. 也就是说到最后他会很快的变成2或者1 而D(2)==2,D(1)=1 也就是说,几次操作过后很多数 ...

  9. 【Educational Codeforces Round 37 E】Connected Components?

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] bfs. 用一个链表来记录哪些点已经确定在某一个联通快里了. 一开始每个点都能用. 然后从第一个点开始进行bfs. 然后对于它的所有 ...

随机推荐

  1. BZOJ4823 CQOI2017老C的方块(最小割)

    如果将其转化为一个更一般的问题即二分图带权最小单边点覆盖(最小控制集)感觉是非常npc的.考虑原题给的一大堆东西究竟有什么奇怪的性质. 容易发现如果与特殊边相邻的两格子都放了方块,并且这两个格子都各有 ...

  2. [CF622F]The Sum of the k-th Powers

    题目大意:给你$n,k(n\leqslant10^9,k\leqslant10^6)$,求:$$\sum\limits_{i=1}^ni^k\pmod{10^9+7}$$ 题解:可以猜测是一个$k+1 ...

  3. BZOJ1031:[JSOI2007]字符加密——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1031 喜欢钻研问题的JS同学,最近又迷上了对加密方法的思考.一天,他突然想出了一种他认为是终极的加密 ...

  4. async的基本用法

    1. async函数的基本形式 //函数声明 async function foo() {} //函数表达式 const foo = async function () {}; //对象的方法 let ...

  5. ContestHunter暑假欢乐赛 SRM 05

    T1 组合数,求一下乘法逆元就行了 没取模 没1LL* 爆零了 T2 让最大子段和最小就行,跑最大子段和的时候若超过S就弹出堆中最大的数,每次有负数加进来不断弹出最小的数相加重新加进堆直到为正数,因为 ...

  6. 【树状数组】【P2345】 奶牛集会

    传送门 Description 约翰的\(N\)头奶牛每年都会参加"哞哞大会".哞哞大会是奶牛界的盛事.集会上的活动很多,比如堆干草,跨栅栏,摸牛仔的屁股等等.它们参加活动时会聚在 ...

  7. 一个简单的适用于Vue的下拉刷新,触底加载组件

    一个简单的适用于Vue的上拉刷新,触底加载组件,没有发布npm需要时直接粘贴定制修改即可 <template> <div class="list-warp-template ...

  8. c++11新特性之nullptr

    在c++11中,nullptr可完全代替NULL.  然而NULL和nullptr还是稍有不同,NULL可被转化为int类型,而nullptr不能.因此nullptr对NULL在进行模板推导或者函数重 ...

  9. bzoj4810 [Ynoi2017]由乃的玉米田 bitset优化+暴力+莫队

    [Ynoi2017]由乃的玉米田 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 917  Solved: 447[Submit][Status][Di ...

  10. Semaphore信号量

    一.前言 互斥锁 同时只允许一个线程更改数据,而Semaphore是同时允许一定数量的线程更改数据 ,比如厕所有3个坑,那最多只允许3个人上厕所,后面的人只能等里面有人出来了才能再进去. 二.sema ...