Comet OJ - Contest #1
A:随便怎么暴力。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define N 25
char getc(){char c=getchar();while (c!='.'&&c!='#') c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int T,n,m;
char a[N][N];
signed main()
{
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif
T=read();
while (T--)
{
n=read(),m=read();
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
a[i][j]=getc();
int u=0,v=0;
for (int i=1;i<=n;i++)
{
int cnt=0;
for (int j=1;j<=m;j++)
if (a[i][j]=='.') cnt++;
if (cnt>v) u=i,v=cnt;
}
int l=0,r=0;
for (int j=1;j<=m;j++)
if (a[u][j]=='.') {l=j;break;}
for (int j=m;j>=1;j--)
if (a[u][j]=='.') {r=j;break;}
cout<<(r-l)/2<<' '<<u<<' '<<(l+r)/2<<endl;
}
return 0;
//NOTICE LONG LONG!!!!!
}
B:显然选择单字符子串能形成n种不同的串。容易发现其他方案一定是由进位产生的,考虑固定某个9为子串右端点会产生多少种方案。数一下由其往前有多少个连续的9,这一段的每个后缀都会产生一种方案。然后再往前看一个数,若不为0答案再+1;若为0,由于所选串不能有前置0,需要找一下之前有没有非零数,若有则答案+1。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define N 200010
char getc(){char c=getchar();while (c!='.'&&c!='#') c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
char s[N];
signed main()
{
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif
int T=read();
while (T--)
{
scanf("%s",s+1);int n=strlen(s+1);
ll ans=0;
bool flag=0;int cnt=0;
int first=n+1;for (int i=1;i<=n;i++) if (s[i]!='0') {first=i;break;}
char last='0';
for (int i=1;i<=n;i++)
{
if (s[i]!='9')
{
cnt=0,ans++;
last=s[i];
}
else
{
cnt++;
ans+=cnt;
if (last=='0') ans+=i-cnt>first;
else ans++;
}
}
cout<<ans<<endl;
}
return 0;
//NOTICE LONG LONG!!!!!
}
C:状态尽量最小表示一下,哈希暴力记搜。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define N 200010
char getc(){char c=getchar();while (c!='.'&&c!='#') c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int T,n;
struct data
{
int x,y;
bool operator <(const data&a) const
{
return x>a.x||x==a.x&&y>a.y;
}
bool operator ==(const data&a) const
{
return x==a.x&&y==a.y;
}
}a[22];
map<ull,int> f;
ull calc(data *a)
{
ull s=0;
for (int i=0;i<=16;i++)
s=s*13+a[i].x,s=s*17+a[i].y;
return s;
}
int work(data *a)
{
ull h=calc(a);
if (f.find(h)!=f.end()) return f[h];
bool flag=0;
for (int i=1;i<=16;i++)
if (a[i].x==0) break;
else
{
if (i==a[0].x) continue;
data b[22];
for (int j=0;j<=16;j++) b[j]=a[j];
a[i].x--;data c=a[i];swap(c.x,c.y);for (int j=1;j<=16;j++) swap(a[j].x,a[j].y);sort(a+1,a+17);
for (int j=1;j<=16;j++) if (a[j]==c) {a[0].x=j;break;}
int u=work(a);
for (int j=0;j<=16;j++) a[j]=b[j];
if (u==-1) return f[h]=1;
if (u==0) flag=1;
}
if (flag) return f[h]=0;
else return f[h]=-1;
}
signed main()
{
#ifndef ONLINE_JUDGE
freopen("d.in","r",stdin);
freopen("d.out","w",stdout);
#endif
T=read();a[0].x=1;f[calc(a)]=0;
while (T--)
{
n=read();
for (int i=1;i<=20;i++) a[i].x=a[i].y=0;
for (int i=1;i<=n;i++) a[read()].x++;
for (int i=1;i<=n;i++) a[read()].y++;
a[0].x=0;
sort(a+1,a+21);
int x=work(a);
if (x==1) puts("AA wins");
if (x==-1) puts("dreamoon wins");
if (x==0) puts("Draw");
}
return 0;
//NOTICE LONG LONG!!!!!
}
D:大讨论大约是可以做的,但大约不是给人写的。考虑简单的做法。套路的将坐标系转45°,使菱形变为正方形,处理出二维前缀和。枚举正方形中心,二分半径,根据该正方形是否包含了所有没有草的点调整二分半径方向。然后判断该正方形中是否没有草,若是则更新答案。于是O(nmlog(n+m))。也可以做到线性,大概没啥本质区别。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 1010
#define mp(x,y) make_pair((x),(y))
char getc(){char c=getchar();while (c!='#'&&c!='.') c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
typedef pair<int,int> pii;
int T,n,m,a[N<<1][N<<1],s[N<<1][N<<1],s2[N<<1][N<<1];
pii trans(pii a){return mp(a.first+a.second,a.first-a.second+m);}
int calc(int x1,int y1,int x2,int y2)
{
x1=max(x1,1),y1=max(y1,1);x2=min(x2,n+m),y2=min(y2,n+m);
return s[x2][y2]-s[x1-1][y2]-s[x2][y1-1]+s[x1-1][y1-1];
}
int calc2(int x1,int y1,int x2,int y2)
{
x1=max(x1,1),y1=max(y1,1);x2=min(x2,n+m),y2=min(y2,n+m);
return s2[x2][y2]-s2[x1-1][y2]-s2[x2][y1-1]+s2[x1-1][y1-1];
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
T=read();
while (T--)
{
n=read(),m=read();
int cnt=0;
for (int i=1;i<=n+m;i++)
for (int j=1;j<=n+m;j++)
s[i][j]=s2[i][j]=0;
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
{
char c=getc();
if (c=='#') a[i][j]=0;
else a[i][j]=1;
cnt+=a[i][j];
s[i+j][i-j+m]=a[i][j];s2[i+j][i-j+m]=1-a[i][j];
}
for (int i=1;i<=n+m;i++)
for (int j=1;j<=n+m;j++)
s[i][j]+=s[i-1][j]+s[i][j-1]-s[i-1][j-1],
s2[i][j]+=s2[i-1][j]+s2[i][j-1]-s2[i-1][j-1];
int ansx=0,ansy=0,ansr=n+m+1;
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
{
int l=0,r=max(n,m),ans=n+m+1;
pii t=trans(mp(i,j));
while (l<=r)
{
int mid=l+r>>1;
if (calc(t.first-mid,t.second-mid,t.first+mid,t.second+mid)==cnt) ans=mid,r=mid-1;
else l=mid+1;
}
if (ans!=n+m+1&&calc(t.first-ans,t.second-ans,t.first+ans,t.second+ans)==cnt&&calc2(t.first-ans,t.second-ans,t.first+ans,t.second+ans)==0)
if (ans<ansr||ans==ansr&&i<ansx||ans==ansr&&i==ansx&&j<ansy) ansx=i,ansy=j,ansr=ans;
}
if (ansr==n+m+1) printf("-1 -1 -1\n");
else printf("%d %d %d\n",ansr,ansx,ansy);
}
return 0;
}
E:对于牛的极长连续段,显然这些牛只能吃与其相邻的草,所以每一段牛互不相干可以分开考虑。对于一段牛,可能吃到的草的数量是牛的数量+1,找到这段里没被吃的草,以该位置将这段牛分成两半,然后只要保证两边的牛都不吃到该草即可。不妨设第一个位置是没被吃的草,容易发现不合法仅当某头向左走的牛移动时,其前方所有牛都已经吃过草。计算概率即可。注意虽然实际上其前方所有向右走的牛都已经吃过草就已经不合法了,但我们只应考虑该牛直接导致不合法的概率。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define P 998244353
#define N 200010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int T,n,inv[N];
char s[N];
signed main()
{
#ifndef ONLINE_JUDGE
freopen("b.in","r",stdin);
freopen("b.out","w",stdout);
#endif
T=read();
inv[0]=inv[1]=1;for (int i=2;i<=100001;i++) inv[i]=P-1ll*(P/i)*inv[P%i]%P;
while (T--)
{
n=2*read()+1;int ans=1;
scanf("%s",s+1);
int cnt1=0,cnt2=0;
for (int i=1;i<=n;i++)
{
if ((i&1)&&(s[i]=='.')) cnt1++;
if (!(i&1)&&(s[i]=='L'||s[i]=='R')) ans=1ll*ans*(++cnt2)%P;
}
if (cnt1!=cnt2) ans=0;
else
for (int i=2;i<=n;i+=2)
if (s[i]=='L'||s[i]=='R')
{
int t=i;
while (t+2<=n&&s[t+2]!='.') t+=2;
int cnt=0,pos=0;
for (int j=i-1;j<=t+1;j+=2)
if (s[j]=='.') cnt++;else pos=j;
if (cnt!=(t-i>>1)+1) {ans=0;break;}
cnt=0;
for (int j=pos-1;j>=i;j-=2)
{
if (s[j]!='L') ans=1ll*ans*cnt%P*inv[cnt+1]%P;
cnt++;
}
cnt=0;
for (int j=pos+1;j<=t;j+=2)
{
if (s[j]!='R') ans=1ll*ans*cnt%P*inv[cnt+1]%P;
cnt++;
}
i=t;
}
printf("%d\n",ans);
}
return 0;
//NOTICE LONG LONG!!!!!
}
F:首先注意到合法欧拉序的任意子串都可以作为某合法欧拉序的前缀。所以随着左端点移动,可以作为欧拉序前缀的右端点单调不降。two pointers扫过去,过程中计算所有与左端点相同的点的贡献即可。
判断一个序列是否是欧拉序显然用栈扫一遍即可。考虑将左端点移动一位的影响,可以发现对于树来说,是将根的第一个儿子提为根而将原来的根变为其最后一个儿子。于是维护的话把栈改为双端队列即可。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define N 1000010
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{
int x=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();
return x*f;
}
int T,n,a[N],cnt[N],p[N];
ll s[N];
deque<int> q;
signed main()
{
#ifndef ONLINE_JUDGE
freopen("b.in","r",stdin);
freopen("b.out","w",stdout);
#endif
T=read();
while (T--)
{
n=read();ll ans=0;
for (int i=1;i<=n;i++) a[i]=read(),p[i]=n+1;
s[n+1]=cnt[n+1]=0;
for (int i=1;i<=n;i++)
{
s[i]=s[p[a[i]]]+i;
cnt[i]=cnt[p[a[i]]]+1;
p[a[i]]=i;
}
for (int i=1;i<=n;i++) p[i]=0;q.clear();
int r=0;
for (int i=1;i<=n;i++)
{
if (i>1)
{
q.pop_front();
if (p[a[i-1]]>=i)
{
if (!q.empty()&&q.front()==a[i]) q.pop_front();
q.push_front(a[i-1]);
q.push_front(a[i]);
}
}
while (r<n)
{
if (p[a[r+1]]<i) q.push_back(a[++r]);
else
{
int x=q.back();q.pop_back();
if (q.empty()||q.back()!=a[r+1]) {q.push_back(x);break;}
++r;
}
p[a[r]]=r;
}
ans+=s[p[a[i]]]-s[i]-1ll*(i-1)*(cnt[p[a[i]]]-cnt[i])+1;
}
cout<<ans<<endl;
}
return 0;
//NOTICE LONG LONG!!!!!
}
似乎有小裙子耶
Comet OJ - Contest #1的更多相关文章
- Comet OJ - Contest #2 简要题解
Comet OJ - Contest #2 简要题解 cometoj A 模拟,复杂度是对数级的. code B 易知\(p\in[l,r]\),且最终的利润关于\(p\)的表达式为\(\frac{( ...
- Comet OJ - Contest #2简要题解
Comet OJ - Contest #2简要题解 前言: 我没有小裙子,我太菜了. A 因自过去而至的残响起舞 https://www.cometoj.com/contest/37/problem/ ...
- Comet OJ - Contest #4--前缀和
原题:Comet OJ - Contest #4-B https://www.cometoj.com/contest/39/problem/B?problem_id=1577传送门 一开始就想着暴力打 ...
- Comet OJ - Contest #11 题解&赛后总结
Solution of Comet OJ - Contest #11 A.eon -Problem designed by Starria- 在模 10 意义下,答案变为最大数的最低位(即原数数位的最 ...
- Comet OJ - Contest #8
Comet OJ - Contest #8 传送门 A.杀手皇后 签到. Code #include <bits/stdc++.h> using namespace std; typede ...
- Comet OJ - Contest #13-C2
Comet OJ - Contest #13-C2 C2-佛御石之钵 -不碎的意志-」(困难版) 又是一道并查集.最近做过的并查集的题貌似蛮多的. 思路 首先考虑,每次处理矩形只考虑从0变成1的点.这 ...
- Comet OJ - Contest #13 「火鼠的皮衣 -不焦躁的内心-」
来源:Comet OJ - Contest #13 芝士相关: 复平面在信息学奥赛中的应用[雾 其实是道 sb 题??? 发现原式貌似十分可二项式定理,然后发现确实如此 我们把 \(a^i\) 替换成 ...
- Comet OJ - Contest #13 「佛御石之钵 -不碎的意志-」(hard)
来源:Comet OJ - Contest #13 一眼并查集,然后发现这题 tmd 要卡常数的说卧槽... 发现这里又要用并查集跳过访问点,又要用并查集维护联通块,于是开俩并查集分别维护就好了 一开 ...
- Comet OJ - Contest #5
Comet OJ - Contest #5 总有一天,我会拿掉给\(dyj\)的小裙子的. A 显然 \(ans = min(cnt_1/3,cnt_4/2,cnt5)\) B 我们可以感性理解一下, ...
- Comet OJ Contest #13 D
Comet OJ Contest #13 D \(\displaystyle \sum_{i=0}^{\left\lfloor\frac{n}{2}\right\rfloor} a^{i} b^{n- ...
随机推荐
- c#中缓存的使用
缓存的使用: 缓存是分布式系统中的重要组件,主要解决高并发,大数据场景下,热点数据访问的性能问题.提供高性能的数据快速访问,提高数据的读取速度.因为服务器和应用客户端之间存在着流量的瓶颈,所以读取大容 ...
- Linux网络相关概念和修改IP地址的方法
2.1.1 网卡的命名规则 CENTOS6的网卡命名方式:它会根据情况有所改变而非唯一且固定,在CENTOS6之前,网络接口使用连续号码命名: eth0. eth1等,当增加或删除网卡时,名称可能会 ...
- 你必须知道的.net读书笔记之第二回深入浅出关键字---对抽象编程:接口和抽象类
请记住,面向对象思想的一个最重要的原则就是:面向接口编程. 借助接口和抽象类,23个设计模式中的很多思想被巧妙的实现了,我认为其精髓简单说来就是:面向抽象编程. 抽象类应主要用于关系密切的对象,而接口 ...
- 杂牌机搞机之旅(二)————移植TWRP第三方Recovery并刷入
原本想把杂牌机作为android破解和开发的测试机,破解的话肯定是安装框架的嘛,毕竟有些是要涉及到脱壳 . 但是,我尝试安装xposed的时候,手机卡在了开机界面,也就是magisk出现了错误,如果想 ...
- Django学习之十: staticfile 静态文件
目录 Django学习之十: staticfile 静态文件 理解阐述 静态文件 Django对静态文件的处理 其它方面 总结 Django学习之十: staticfile 静态文件 理解阐述 ...
- 关于asp.net执行exe程序时权限不够的解决办法(2015.04.17更新)
一,本文背景 长话短说:asp.net项目中需要用到PDF转换成SWF文件,用户上传后自动调用pdf2swf.exe转换. 但有个问题,执行时权限不够,导致一直报错(滚动条一直在往下滚,刷屏中),见下 ...
- iframe中的a标签电话链接不能正常打开
背景 经测试,android手机中没有这个问题, iphone手机中的Safari浏览器会出现这个问题. 例如: <a href = "tel://1-408-555-5555&quo ...
- Flutter项目之app升级方案
题接上篇的文章的项目,还是那个空货管理app.本篇文章用于讲解基于Flutter的app项目的升级方案. 在我接触Flutter之前,做过一个比较失败的基于DCloud的HTML5+技术的app,做过 ...
- SSM框架多数据源和AOP事务管理之间
- SQL Server系统表sysobjects介绍
SQL Server系统表sysobjects介绍 sysobjects 表结构: 列名 数据类型 描述 name sysname 对象名,常用列 id int 对象标识号 xtype char(2) ...