Educational Codeforces Round 56 Div. 2 翻车记
A:签到。
B:仅当只有一种字符时无法构成非回文串。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 1010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<''||c>'')) c=getchar();return c;}
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int T,n,cnt[];
char s[N];
int main()
{
/*#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif*/
T=read();
while (T--)
{
scanf("%s",s+);n=strlen(s+);
memset(cnt,,sizeof(cnt));
for (int i=;i<=n;i++) cnt[s[i]-'a']++;
int tot=;
for (int i=;i<;i++) if (cnt[i]) tot++;
if (tot==) cout<<-<<endl;
else
{
for (int i=;i<;i++)
for (int j=;j<=cnt[i];j++)
putchar(i+'a');
cout<<endl;
}
}
return ;
}
C:在满足条件的前提下使每对数的差尽量大。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 200010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<''||c>'')) c=getchar();return c;}
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
ll read()
{
ll x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n;
ll a[N],b[N],l,r;
int main()
{
/*#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif*/
n=read();
for (int i=;i<=(n>>);i++) a[i]=read();
l=,r=;
for (int i=;i<=(n>>);i++)
{
b[i]=l,b[n-i+]=a[i]-l;
if (b[n-i+]>r) b[i]+=b[n-i+]-r,b[n-i+]=r;
l=b[i],r=b[n-i+];
}
for (int i=;i<=n;i++) printf("%I64d ",b[i]);
return ;
}
D:二分图染色,每个连通块贡献相乘即可。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 300010
#define P 998244353
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<''||c>'')) c=getchar();return c;}
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
ll read()
{
ll x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int T,n,m,t,p[N],color[N],white,black;
bool flag;
struct data{int to,nxt;
}edge[N<<];
void addedge(int x,int y){t++;edge[t].to=y,edge[t].nxt=p[x],p[x]=t;}
void dfs(int k,int c)
{
if (flag==) return;
color[k]=c;if (c==) white++;else black++;
for (int i=p[k];i;i=edge[i].nxt)
{
if (flag==) return;
if (color[edge[i].to]==-) dfs(edge[i].to,c^);
else if (color[edge[i].to]==c) {flag=;return;}
}
}
int ksm(int a,int k)
{
int s=;
for (;k;k>>=,a=1ll*a*a%P)if (k&) s=1ll*s*a%P;
return s;
}
int main()
{
/*#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif*/
T=read();
while (T--)
{
n=read(),m=read();flag=;t=;
for (int i=;i<=n;i++) p[i]=,color[i]=-;
for (int i=;i<=m;i++)
{
int x=read(),y=read();
addedge(x,y),addedge(y,x);
}
int cnt=,ans=;
for (int i=;i<=n;i++)
if (color[i]==-)
{
white=black=,cnt++,dfs(i,);
ans=1ll*ans*(ksm(,white)+ksm(,black))%P;
}
if (flag==) ans=;
printf("%d\n",ans);
}
return ;
}
这都啥思博题啊20min切完。E一眼树状数组套个权值线段树,犹豫了一下ECR的E会不会这么毒瘤,最后还是码了。30min之后疯狂RE22,因为空间根本开不下。这时候才想起来带修改之后树状数组套个treap和它复杂度是一样的,还能回收下空间,于是又开始码码码,过了20min终于A掉了。
E:将每个数在两个排列里的位置视为一个二维坐标。现在要做到就是插点/删点/矩形内点的个数。树状数组套treap即可,需要回收空间。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<ctime>
using namespace std;
#define ll long long
#define N 200010
#define lson tree[k].ch[0]
#define rson tree[k].ch[1]
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<''||c>'')) c=getchar();return c;}
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
ll read()
{
ll x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,m,a[N],b[N],root[N],pos[N][],q[N<<],head,tail,t;
struct data{int ch[],p,x,s;
}tree[N<<];
int up(int k){tree[k].s=tree[lson].s+tree[rson].s+;}
void move(int &k,int p)
{
int t=tree[k].ch[p];
tree[k].ch[p]=tree[t].ch[!p],tree[t].ch[!p]=k,up(k),up(t),k=t;
}
void INS(int &k,int x)
{
if (k==) {if (head<tail) k=q[++head];else k=++t;tree[k].ch[]=tree[k].ch[]=;tree[k].x=x;tree[k].p=rand();tree[k].s=;return;}
tree[k].s++;
if (tree[k].x<=x) {INS(rson,x);if (tree[rson].p>tree[k].p) move(k,);}
else {INS(lson,x);if (tree[lson].p>tree[k].p) move(k,);}
}
void DEL(int &k,int x)
{
if (tree[k].x==x)
{
if (lson==||rson==) {q[++tail]=k;k=lson|rson;return;}
if (tree[lson].p>tree[rson].p) move(k,),DEL(rson,x);
else move(k,),DEL(lson,x);
}
else if (tree[k].x<x) DEL(rson,x);
else DEL(lson,x);
up(k);
}
int find(int k,int x)
{
if (!k) return ;
if (tree[k].x<=x) return tree[lson].s++find(rson,x);
else return find(lson,x);
}
void ins(int k,int x)
{
while (k<=n) INS(root[k],x),k+=k&-k;
}
void del(int k,int x)
{
while (k<=n) DEL(root[k],x),k+=k&-k;
}
int query(int k,int x)
{
int ans=;
while (k) ans+=find(root[k],x),k-=k&-k;
return ans;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif
n=read(),m=read();
srand(time());
for (int i=;i<=n;i++) a[i]=read(),pos[a[i]][]=i;
for (int i=;i<=n;i++) b[i]=read(),pos[b[i]][]=i;
for (int i=;i<=n;i++) ins(i,pos[a[i]][]);
for (int i=;i<=m;i++)
{
int op=read();
if (op==)
{
int la=read(),ra=read(),lb=read(),rb=read();
printf("%d\n",query(ra,rb)-query(ra,lb-)-query(la-,rb)+query(la-,lb-));
}
else
{
int x=read(),y=read();
del(pos[b[x]][],x),del(pos[b[y]][],y),
ins(pos[b[x]][],y),ins(pos[b[y]][],x);
swap(b[x],b[y]);
}
}
return ;
}
G:将两点间曼哈顿距离的绝对值展开讨论,可以发现对于每种情况,两点每维坐标的贡献与其原来该维坐标的关系都是相同的(即正或负),于是线段树暴力维护2k种状态即可。我也不知道为什么两个树套树我只写了50min(bit套树根本就没什么码量吧),一个裸的线段树我能写40min。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<ctime>
using namespace std;
#define ll long long
#define N 200010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<''||c>'')) c=getchar();return c;}
int gcd(int n,int m){return m==?n:gcd(m,n%m);}
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,m,k,a[N][];
struct data{int l,r,f[],g[];
}tree[N<<];
void dfs(int node,int x,int p,int s,int sum)
{
if (p==k) {tree[node].f[sum]=tree[node].g[sum]=s;return;}
dfs(node,x,p+,s-a[x][p],sum);
dfs(node,x,p+,s+a[x][p],sum|(<<p));
}
data merge(data x,data y)
{
data u;u.l=x.l,u.r=y.r;
for (int i=;i<(<<k);i++)
u.f[i]=max(x.f[i],y.f[i]),u.g[i]=min(x.g[i],y.g[i]);
return u;
}
void build(int k,int l,int r)
{
tree[k].l=l,tree[k].r=r;
if (l==r) {dfs(k,l,,,);return;}
int mid=l+r>>;
build(k<<,l,mid);
build(k<<|,mid+,r);
tree[k]=merge(tree[k<<],tree[k<<|]);
}
void modify(int k,int x)
{
if (tree[k].l==tree[k].r) {dfs(k,x,,,);return;}
int mid=tree[k].l+tree[k].r>>;
if (x<=mid) modify(k<<,x);
else modify(k<<|,x);
tree[k]=merge(tree[k<<],tree[k<<|]);
}
data query(int k,int l,int r)
{
if (tree[k].l==l&&tree[k].r==r) return tree[k];
int mid=tree[k].l+tree[k].r>>;
if (r<=mid) return query(k<<,l,r);
else if (l>mid) return query(k<<|,l,r);
else return merge(query(k<<,l,mid),query(k<<|,mid+,r));
}
int main()
{
n=read(),k=read();
for (int i=;i<=n;i++)
for (int j=;j<k;j++)
a[i][j]=read();
build(,,n);
m=read();
for (int i=;i<=m;i++)
{
int op=read();
if (op==)
{
int x=read();
for (int j=;j<k;j++) a[x][j]=read();
modify(,x);
}
else
{
int l=read(),r=read();
data x=query(,l,r);
int ans=;
for (int i=;i<(<<k);i++)
ans=max(ans,x.f[i]-x.g[i]);
printf("%d\n",ans);
}
}
}
F:没看。
突然小号也变得橘里橘气。result:rank 10 rating +170
Educational Codeforces Round 56 Div. 2 翻车记的更多相关文章
- Educational Codeforces Round 55 Div. 2 翻车记
A:签到. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> ...
- Educational Codeforces Round 53 Div. 2翻车记
A:差点开场懵逼.只要有相邻两位不同就可以作为答案. #include<iostream> #include<cstdio> #include<cmath> #in ...
- Codeforces Round#500 Div.2 翻车记
A:签到 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> # ...
- Codeforces Round#509 Div.2翻车记
A:签到 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> # ...
- Codeforces Round#514 Div.2 翻车记
A:签到 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> # ...
- Codeforces Round #524 Div. 2 翻车记
A:签到.room里有一个用for写的,hack了一发1e8 1,结果用了大概600+ms跑过去了.惨绝人寰. #include<iostream> #include<cstdio& ...
- Codeforces Round#516 Div.1 翻车记
A:开场懵逼.然后发现有人1min过,于是就sort了一下,于是就过了.正经证明的话,考虑回文串两端点一定是相同的,所以最多有Σcnti*(cnti+1)/2个,cnti为第i种字母出现次数.而sor ...
- Codeforces Round #517 Div. 1翻车记
A:真的懵逼了.冷静了半天之后决定二分一下答案,然后先a安排上尽量小的再贪心地一个个扩大.40min才过.这个做法非常怂的以代码复杂度和时间复杂度为代价换取了比较稳的正确性,事实上由于1~n可以组合出 ...
- Educational Codeforces Round 84 (Div. 2)
Educational Codeforces Round 84 (Div. 2) 读题读题读题+脑筋急转弯 = =. A. Sum of Odd Integers 奇奇为奇,奇偶为偶,所以n,k奇偶性 ...
随机推荐
- python易错盲点排查之+=与+的区别分析以及一些赋值运算踩过的坑
问题1. int和list是不一样的 >>> a=1 >>> b=a >>> a+=1 >>> a,b (2, 1) >& ...
- Python科学计算库-Numpy
NumPy 是 Python 语言的一个扩充程序库.支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库,也是学习 python 必学的一个库. 1. 读取文件 numpy.gen ...
- 记一次eslint规则配置
{ // 环境定义了预定义的全局变量. "env": { //环境定义了预定义的全局变量.更多在官网查看 "browser": true, "node ...
- NO--13微信小程序,左右联动
写在前面: 从2016年张小龙发布微信小程序这种新的形态,到2017年小程序的不温不火,再到今年小程序的大爆发,从一度刷爆朋友圈的‘头脑王者’,再到春节聚会坐在一起的火爆小游戏“跳一跳",都 ...
- 2015第六届蓝桥杯C/C++ B组
奖券数目:枚举 有些人很迷信数字,比如带“4”的数字,认为和“死”谐音,就觉得不吉利.虽然这些说法纯属无稽之谈,但有时还要迎合大众的需求.某抽奖活动的奖券号码是5位数(10000-99999),要求其 ...
- NO.2:自学tensorflow之路------BP神经网络编程
引言 在上一篇博客中,介绍了各种Python的第三方库的安装,本周将要使用Tensorflow完成第一个神经网络,BP神经网络的编写.由于之前已经介绍过了BP神经网络的内部结构,本文将直接介绍Tens ...
- JavaScript学习(1)之JavaScript基础
JavaScript学习(1)之JavaScript基础 由于工作原因,开发语言逐渐以JavaScript为主,所以,抽空学习了下JavaScript语法.等现阶段的工作稳定之后,陆续会分享下自己在学 ...
- vue项目部署流程
用vue-cli搭建的做法1.npm run build2.把dist里的文件打包上传至服务器 例 /data/www/,我一般把index.html放在static里所以我的文件路径为:/data/ ...
- Virtual DOM的简单实现
了解React的同学都知道,React提供了一个高效的视图更新机制:Virtual DOM,因为DOM天生就慢,所以操作DOM的时候要小心翼翼,稍微改动就会触发重绘重排,大量消耗性能. 1.Virtu ...
- python下graphviz安装
参考链接:https://blog.csdn.net/u013250416/article/details/72790754 1.安装Graphviz 在graphviz的官网(网址:http://w ...