Hello 2019 自闭记
A:8min才过???
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define int long long
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;
}
signed main()
{
/*#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
const char LL[]="%I64d\n";
#endif*/
char a=getc(),b=getc();
for (int i=;i<;i++)
{
char x=getc(),y=getc();
if (a==x||b==y) {cout<<"YES";return ;}
}
cout<<"NO";
return ;
//NOTICE LONG LONG!!!!!
}
B:WA了一发???
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define int long long
#define N 20
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,a[N];
bool flag=;
void dfs(int k,int s)
{
if (flag) return;
if (k>n&&s==) {flag=;return;}
if (k>n) return;
dfs(k+,(s+a[k])%);
dfs(k+,(s-a[k]+)%);
}
signed main()
{
/*#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
const char LL[]="%I64d\n";
#endif*/
n=read();
for (int i=;i<=n;i++) a[i]=read();
dfs(,);
if (flag) cout<<"YES";else cout<<"NO";
return ;
//NOTICE LONG LONG!!!!!
}
C:多余匹配括号去掉后设右括号个数为x,左括号个数为y,则匹配的括号序列对要求y1+y2=0 x1=0 y1+x2=0,瞎贪贪就行了。RE了一发40min才过???
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
#define int long long
#define N 500010
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,ans;
char s[N];
vector<int> b[N<<];
struct data
{
int x,y;
}a[N];
signed main()
{
#ifndef ONLINE_JUDGE
freopen("c.in","r",stdin);
freopen("c.out","w",stdout);
const char LL[]="%I64d\n";
#endif
n=read();
for (int i=;i<=n;i++)
{
scanf("%s",s+);int m=strlen(s+);
int cnt=;
for (int j=;j<=m;j++)
{
if (s[j]=='(') cnt++;else cnt--;
a[i].x=min(a[i].x,cnt);
}
a[i].y=cnt;
b[a[i].y+N].push_back(a[i].x);
}
// y1+y2=0 y1+x2>=0
for (int i=;i<(N<<);i++) sort(b[i].begin(),b[i].end());
int cnt=;
for (int i=;i<b[N].size();i++) if (b[N][i]>=) cnt++;
ans=cnt/;
for (int i=N+;i<(N<<);i++)
{
int head=,tail=b[i].size();tail--;
while (head<b[N-(i-N)].size()&&tail>=&&b[i][tail]>=)
{
while (head<b[N-(i-N)].size()&&i-N+b[N-(i-N)][head]<) head++;
if (head>=b[N-(i-N)].size()) break;
tail--;head++;ans++;
}
}
cout<<ans;
return ;
//NOTICE LONG LONG!!!!!
}
D:暴力dp,对每个质因子做即可。看错题了一发???
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define P 1000000007
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;
}
ll n,prime[];
int m,cnt[],a[],f[][],g[][],inv[],t,tot=,ans=;
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;
}
void dfs(int k,ll s,ll u)
{
if (k>t) {ans=(ans+s%P*u)%P;return;}
for (a[k]=;a[k]<=cnt[k];a[k]++)
{
dfs(k+,s,u*f[k][a[k]]%P);
s*=prime[k];
}
}
signed main()
{
#ifndef ONLINE_JUDGE
freopen("d.in","r",stdin);
freopen("d.out","w",stdout);
const char LL[]="%I64d\n";
#endif
cin>>n>>m;
for (int i=;1ll*i*i<=n;i++)
if (n%i==)
{
t++;prime[t]=i;
while (n%i==) cnt[t]++,n/=i;
}
if (n>) prime[++t]=n,cnt[t]=;
for (int i=;i<=;i++) inv[i]=ksm(i,P-);
for (int i=;i<=t;i++)
{
memset(g[],,sizeof(g[]));g[][cnt[i]]=;
for (int j=;j<=m;j++)
{
g[j][cnt[i]+]=;
for (int k=cnt[i];k>=;k--)
g[j][k]=(g[j][k+]+1ll*g[j-][k]*inv[k+])%P;
}
for (int k=;k<=cnt[i];k++) f[i][k]=g[m][k];
}
//for (int i=1;i<=t;i++) tot=1ll*tot*C[cnt[i]+m][cnt[i]]%P;tot=inv(tot);
dfs(,,);
//cout<<1ll*ans*tot%P;
cout<<ans;
return ;
//NOTICE LONG LONG!!!!!
}
F感觉非常神仙???过了很长时间才明白不是什么乱七八糟的线段树合并而是bitset啊???但还是不会啊???怎么这么多人过啊???叉人还被抢啊???自闭了啊???
result:rank 422 rating +12
F:显然只需要维护集合中每个数出现次数的奇偶性,考虑使用bitset。3操作非常难实现,可以考虑改为维护每个数的倍数的奇偶性,这样就相当于and了。然后考虑怎么以这种方式统计答案。使用莫比乌斯函数容斥即可。好思博啊怎么我不会啊???
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<bitset>
using namespace std;
#define N 100010
#define V 7001
bitset<V> a[N],b[V];
int n,m,mobius[V];
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 main()
{
#ifndef ONLINE_JUDGE
freopen("f.in","r",stdin);
freopen("f.out","w",stdout);
#endif
n=read(),m=read();
for (int i=;i<V;i++)
for (int j=i*i;j<V;j+=i*i)
mobius[j]=;
for (int i=;i<V;i++) mobius[i]^=;
for (int i=;i<V;i++)
for (int j=i;j<V;j+=i)
b[i][j]=mobius[j/i];
while (m--)
{
int op=read();
if (op==)
{
int x=read(),y=read();a[x]=;
for (int i=;i*i<=y;i++)
if (y%i==)
{
a[x][i]=;
if (i*i!=y) a[x][y/i]=;
}
}
if (op==)
{
int z=read(),x=read(),y=read();
a[z]=a[x]^a[y];
}
if (op==)
{
int z=read(),x=read(),y=read();
a[z]=a[x]&a[y];
}
if (op==)
{
int x=read(),y=read();
printf("%d",(a[x]&b[y]).count()&);
}
}
return ;
}
//f[x]=Σcnt[d] d|x
//
G:先考虑k=1时怎么做。设f[i][1]为i作为斯坦纳树(暂且就这么叫)的根(该点不一定被选中)时所有方案边数之和,f[i][0]为上述方案数;g[i][1]为i作为斯坦纳树的根(但目前选中的点的斯坦纳树实际上并不将其包含,且选中点集不为空)时所有方案边数之和,g[i][0]为上述方案数。转移考虑f必须是选中根或至少选中两棵子树,g只选中一棵子树。f可以不考虑限制后再减掉g。这个沙雕dp已经想了我2h了。
然后考虑怎么求k次方。容易想到在dp中记录各次方,(事实上刚才的dp中就记录了0次方和1次方)具体转移由二项式定理即可得,注意细节。那么暴力复杂度是O(nk2),NTT优化后可以做到O(nklogk)。复杂度看上去就很不靠谱,并且甚至题就没给NTT模数。(但还是有神仙用NTT过掉了)
#include<bits/stdc++.h>
using namespace std;
#define P 998244353 //当然原题的模数是1e9+7
#define N 100010
#define M 210
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,p[N],f[N][M],g[N][M],size[N],C[M][M],fac[M],inv[M],p2[N],tmp[M],a[<<],b[<<],r[<<],t,ans,inv3,inv512;
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 inc(int &x,int y){x+=y;if (x>=P) x-=P;}
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 INV(int a){return ksm(a,P-);}
void DFT(int *a,int n,int g)
{
for (int i=;i<n;i++) if (i<r[i]) swap(a[i],a[r[i]]);
for (int i=;i<=n;i<<=)
{
int wn=ksm(g,(P-)/i);
for (int j=;j<n;j+=i)
{
int w=;
for (int k=j;k<j+(i>>);k++,w=1ll*w*wn%P)
{
int x=a[k],y=1ll*w*a[k+(i>>)]%P;
a[k]=(x+y)%P,a[k+(i>>)]=(x-y+P)%P;
}
}
}
}
void mul(int *a,int *b)
{
DFT(a,<<,),DFT(b,<<,);
for (int i=;i<(<<);i++) a[i]=1ll*a[i]*b[i]%P;
DFT(a,<<,inv3);
for (int i=;i<(<<);i++) a[i]=1ll*a[i]*inv512%P;
}
void dfs(int k,int from)
{
f[k][]=;size[k]=;
for (int i=p[k];i;i=edge[i].nxt)
if (edge[i].to!=from)
{
dfs(edge[i].to,k);
memset(a,,sizeof(a)),memset(b,,sizeof(b));
for (int j=;j<=m;j++) a[j]=inv[j],b[j]=1ll*inv[j]*(f[edge[i].to][j]+g[edge[i].to][j])%P;
mul(a,b);for (int j=;j<=m;j++) tmp[j]=1ll*a[j]*fac[j]%P;
for (int j=;j<=m;j++) inc(g[k][j],tmp[j]);
memset(a,,sizeof(a));memset(b,,sizeof(b));
for (int j=;j<=m;j++) a[j]=1ll*inv[j]*f[k][j]%P,b[j]=1ll*inv[j]*tmp[j]%P;
mul(a,b);for (int j=;j<=m;j++) tmp[j]=1ll*a[j]*fac[j]%P;
for (int j=;j<=m;j++) inc(f[k][j],tmp[j]);
f[k][]=p2[size[k]+=size[edge[i].to]];
}
for (int j=;j<=m;j++) inc(f[k][j],P-g[k][j]);
f[k][]--;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("g.in","r",stdin);
freopen("g.out","w",stdout);
#endif
n=read(),m=read();inv3=INV(),inv512=INV();
C[][]=;
for (int i=;i<=m;i++)
{
C[i][]=C[i][i]=;
for (int j=;j<i;j++)
C[i][j]=(C[i-][j-]+C[i-][j])%P;
}
fac[]=;for (int i=;i<=m;i++) fac[i]=1ll*fac[i-]*i%P;
inv[]=inv[]=;for (int i=;i<=m;i++) inv[i]=P-1ll*inv[P%i]*(P/i)%P;
for (int i=;i<=m;i++) inv[i]=1ll*inv[i-]*inv[i]%P;
for (int i=;i<(<<);i++) r[i]=(r[i>>]>>)|(i&)*(<<);
for (int i=;i<n;i++)
{
int x=read(),y=read();
addedge(x,y),addedge(y,x);
}
p2[]=;for (int i=;i<=n;i++) p2[i]=(p2[i-]<<)%P;
dfs(,);
for (int i=;i<=n;i++) inc(ans,f[i][m]);
cout<<ans;
return ;
}
换一种思路。https://www.cnblogs.com/Gloid/p/9553291.html 我们想起来还做过这么个题。搬上同样的做法即可。然后我发现我不会转移了,就非常开心的弃掉了。
E:见官方题解及讨论区一楼补充。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
#define ll long long
#define N 100010
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,a[N],b[N],f[N],q[N],cnt;
bool flag[N];
vector<int> ans[N],tmp[N];
int solve(int op)
{
for (int i=;i<=n;i++) q[i]=;
int tail=;tmp[].clear();
for (int i=;i<=n;i++)
{
int l=,r=tail,ans=;
while (l<=r)
{
int mid=l+r>>;
if (a[i]>a[q[mid]]) ans=mid,l=mid+;
else r=mid-;
}
f[i]=q[ans];ans++;if (ans>tail) {tail++;if (op) tmp[tail].clear();}
q[ans]=i;if (op) tmp[ans].push_back(a[i]);
}
if (op) for (int i=;i<=tail;i++) ans[++cnt]=tmp[i];
return tail;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("e.in","r",stdin);
freopen("e.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
T=read();
while (T--)
{
n=read();
for (int i=;i<=n;i++) a[i]=read();
cnt=;
while (n)
{
int LIS=solve(),end_LIS=q[LIS];
for (int i=;i<=n;i++) flag[i]=;
if ((1ll*LIS*(LIS+)>>)>n)
{
cnt++;ans[cnt].clear();
int x=end_LIS;
while (x)
{
ans[cnt].push_back(a[x]);
flag[x]=;x=f[x];
}
reverse(ans[cnt].begin(),ans[cnt].end());
int m=;
for (int i=;i<=n;i++) if (!flag[i]) b[++m]=a[i];
n=m;for (int i=;i<=n;i++) a[i]=b[i];
}
else {solve();break;}
}
printf("%d\n",cnt);
for (int i=;i<=cnt;i++)
{
printf("%d ",ans[i].size());
for (int j=;j<ans[i].size();j++)
printf("%d ",ans[i][j]);
printf("\n");
}
}
return ;
}
Hello 2019 自闭记的更多相关文章
- PKUWC 2019 自闭记
PKUWC 2019 自闭记 Day -1 考前天天在隔壁的物竞教室划水(雀魂,能和吉老师一起玩的游戏都是好游戏),没有做题. Day 0 早上8:16的高铁,到广州南居然要6个小时...不知道福州和 ...
- Yahoo Programming Contest 2019 自闭记
A:签到. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> ...
- KEYENCE Programming Contest 2019 自闭记
A:签到. #include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> ...
- 2019 Multi-University Training Contest 2: 1010 Just Skip The Problem 自闭记
2019 Multi-University Training Contest 2: 1010 Just Skip The Problem 自闭记 题意 多测.每次给你一个数\(n\),你可以同时问无数 ...
- PKUWC 2019&WC 2019爆零记
PKUWC 2019&WC 2019爆零记 毕竟过了很久了,杂七杂八的东西就不写了,并且除成绩之外的内容不保证其正确性. Day1 T1:看到这道题很舒服啊,枚举top序算合法图的数量,状压D ...
- 【杂文】NOIP2018 蒟蒻自闭记
[杂文]NOIP2018 蒟蒻自闭记 都 \(9102\) 年了,谁还记得 \(2018\) 年的事啊 \(QAQ\) . 还有两个月就要去参加首届 \(CSP\) 了. 想着如果再不记下去年那些事儿 ...
- JOISC2020 自闭记
以下是我考场上的思路,很多题都不是正解.对于某些题目,我们使用<代码部落>中的题解,希望大家能够看懂 JOISC2020 Round1 自闭记 T1 11 pts 算法:考虑\(DP\). ...
- diverta 2019 Programming Contest 2自闭记
A 签到(a-b problem不用贴了吧,以后atcoder小于300分题均不贴代码) B 发现选择的p,q一定是其中两点间的距离,于是可以O(n2)枚举两点,再O(n2)判断,其实可以做到O(n3 ...
- [ZJOI2019]游记之我的第一次省选--自闭记
2019/3/23 day -1 今天是体育中考....(祝我好运) 实心球再次投出测量范围,虽然成绩是10.5,但是目测有15米. 立定跳远2.70,好近,我爸叫我跳2.8的QwQ. 1000米最后 ...
随机推荐
- tarjan - 强连通
如果两个点可以互相到达,则称为强连通.如果有向图G每个点都可以互相到达,则称为强连通图.其中G中的极大强连通子图,则称为强连通分量.现求强连通分量是多少,且哪些点属于同一个强连通分量 tarjan由d ...
- day32
今日内容 1.基于TCP协议(通信循环) 2.基于TCP协议(连接循环) 3.粘包问题 4.模拟SSH实现远程执行命令 服务器端 ################################### ...
- 详细解读大数据分析引擎Pig&PigLatin语句
Pig 一.Pig的介绍: Pig由Yahoo开发,主要应用于数据分析,Twitter公司大量使用Pig处理海量数据,Pig之所以是数据分析引擎,是因为Pig相当于一个翻译器,将PigLatin语句翻 ...
- test_maven_实现表单验证
这篇文章是我的上一篇文章的续集,如未看过,可看一下,上面的test_maven再继续看这个 这篇文章主要是阐述使用struts实现表单验证的功能. 1.首先了解actionContext:Action ...
- ccf201703-1分蛋糕
问题描述 小明今天生日,他有n块蛋糕要分给朋友们吃,这n块蛋糕(编号为1到n)的重量分别为a1, a2, …, an.小明想分给每个朋友至少重量为k的蛋糕.小明的朋友们已经排好队准备领蛋糕,对于每个朋 ...
- JS计算混合字符串长度
用的是正则表达式 var str = ”坦克是tank的音译”; var len = str.match(/[^ -~]/g) == null ? str.length : str.length + ...
- Nuxt 开发 - 项目初始化
Nuxt是基于Vue的一个应用框架,采用服务端渲染(SSR),可以让用户的Vue单页面应用(SPA)也可以有利于SEO. 项目初始化 参考:https://zh.nuxtjs.org/guide/in ...
- 同步、异步、回调执行顺序之经典闭包setTimeout分析
聊聊同步.异步和回调 同步,异步,回调,我们傻傻分不清楚, 有一天,你找到公司刚来的程序员小T,跟他说:“我们要加个需求,你放下手里的事情优先支持,我会一直等你做完再离开”.小T微笑着答应了,眼角却滑 ...
- 如何有效的报告bug?
对于比较棘手的bug,反馈务须清晰.详细.精确,我们给出以下6个建议: 1.现场演示:重复bug出现的操作步骤.这个适用于公司内部人员. 2.详细描述:在什么系统使用哪个版本的YoMail,做了什 ...
- OpenGL学习(2)——绘制三角形(补)
对上一篇的补充,通过绘制三角形来完成矩形的绘制.此外,完成章节后练习. 绘制矩形 一个矩形由两个三角形组成,因此绘制矩形需要绘制两个三角形,一共6个顶点,其中2个顶点重复画了两次. 为了减小开销,仅储 ...