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奇偶性 ...
随机推荐
- java基础解析系列(三)---HashMap
java基础解析系列(三)---HashMap java基础解析系列 java基础解析系列(一)---String.StringBuffer.StringBuilder java基础解析系列(二)-- ...
- 接口测试之基础篇--http协议
概念:超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议.所有的WWW文件都必须遵守这个标准.设计HTTP最初的目的是为了提供一种 ...
- 微信小程序中的 hover-class
微信小程序中,可以用 hover-class 属性来指定元素的点击态效果.但是在在使用中要注意,大部分组件是不支持该属性的. 目前支持 hover-class 属性的组件有三个:view.button ...
- 布线问题 (NYOJ38)
布线问题 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 南阳理工学院要进行用电线路改造,现在校长要求设计师设计出一种布线方式,该布线方式需要满足以下条件:1.把所有 ...
- Memcached服务器上实现多个实例(约约问题排查)
约约测试服上出行一个问题,司机收车失败. (1)经查看代码是null指针异常. 针对,之前,同套代码发布到华威测试服,未出现该问题,遂认定不是代码问题. (2)打印异常信息,获取null值异常的收车司 ...
- Netty源码分析第2章(NioEventLoop)---->第8节: 执行任务队列
Netty源码分析第二章: NioEventLoop 第八节: 执行任务队列 继续回到NioEventLoop的run()方法: protected void run() { for (;;) ...
- ats 分层缓存
了解缓存层次结构 缓存层次结构由彼此通信的缓存级别组成.ats支持多种类型的缓存层次结构. 所有缓存层次结构都识别父和子的概念. 父缓存是层次结构中较高的缓存, ats可以 将请求转发到该缓存.子缓存 ...
- linux磁盘扩容日志
//针对ext4文件格式的操作系统(如CentOS6):// umount /dev/vdb e2fsck -f /dev/vdb resize2fs /dev/vdb mount /dev/vdb ...
- bc命令详解
基础命令学习目录首页 原文链接:https://www.cnblogs.com/lovevivi/p/4359296.html 最近经常要在linux下做一些进制转换,看到了可以使用bc命令,如下: ...
- 关于MySql8.X设置允许root远程登陆的问题
这是最近在mac上使用mysql workbench上遇到的一个小问题,仔细想了想其实这个问题本身就有毛病,论起正式环境来哪家公司是直接使用root去远程登录的呢?恐怕没几个,so不纠结root了创建 ...