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的更多相关文章

  1. Comet OJ - Contest #2 简要题解

    Comet OJ - Contest #2 简要题解 cometoj A 模拟,复杂度是对数级的. code B 易知\(p\in[l,r]\),且最终的利润关于\(p\)的表达式为\(\frac{( ...

  2. Comet OJ - Contest #2简要题解

    Comet OJ - Contest #2简要题解 前言: 我没有小裙子,我太菜了. A 因自过去而至的残响起舞 https://www.cometoj.com/contest/37/problem/ ...

  3. Comet OJ - Contest #4--前缀和

    原题:Comet OJ - Contest #4-B https://www.cometoj.com/contest/39/problem/B?problem_id=1577传送门 一开始就想着暴力打 ...

  4. Comet OJ - Contest #11 题解&赛后总结

    Solution of Comet OJ - Contest #11 A.eon -Problem designed by Starria- 在模 10 意义下,答案变为最大数的最低位(即原数数位的最 ...

  5. Comet OJ - Contest #8

    Comet OJ - Contest #8 传送门 A.杀手皇后 签到. Code #include <bits/stdc++.h> using namespace std; typede ...

  6. Comet OJ - Contest #13-C2

    Comet OJ - Contest #13-C2 C2-佛御石之钵 -不碎的意志-」(困难版) 又是一道并查集.最近做过的并查集的题貌似蛮多的. 思路 首先考虑,每次处理矩形只考虑从0变成1的点.这 ...

  7. Comet OJ - Contest #13 「火鼠的皮衣 -不焦躁的内心-」

    来源:Comet OJ - Contest #13 芝士相关: 复平面在信息学奥赛中的应用[雾 其实是道 sb 题??? 发现原式貌似十分可二项式定理,然后发现确实如此 我们把 \(a^i\) 替换成 ...

  8. Comet OJ - Contest #13 「佛御石之钵 -不碎的意志-」(hard)

    来源:Comet OJ - Contest #13 一眼并查集,然后发现这题 tmd 要卡常数的说卧槽... 发现这里又要用并查集跳过访问点,又要用并查集维护联通块,于是开俩并查集分别维护就好了 一开 ...

  9. Comet OJ - Contest #5

    Comet OJ - Contest #5 总有一天,我会拿掉给\(dyj\)的小裙子的. A 显然 \(ans = min(cnt_1/3,cnt_4/2,cnt5)\) B 我们可以感性理解一下, ...

  10. 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- ...

随机推荐

  1. Notepad++替换SQL Server Select窗口列名的中括号的小技巧

    条件:“查找模式”那选中“扩展” 一.简单替换 查找目标(包括空格,各个SSMS版本可能不同): ]\r\n ,[ 替换为:, 二.替换为@ 查找目标(包括空格,各个SSMS版本可能不同): ]\r\ ...

  2. Asp.Net MVC Unobtrusive Ajax

    1.   Unobtrusive JavaScript介绍 说到Unobtrusive Ajax,就要谈谈UnobtrusiveJavaScript了,所谓Unobtrusive JavaScript ...

  3. Kafka学习资料

    博客系列: Apache Kafka简介Apache Kafka安装和使用Apache Kafka核心概念kafka核心组件和流程—控制器kafka核心组件和流程—协调器kafka核心组件和流程—日志 ...

  4. 【Tomcat】Tomcat工作原理及简单模拟实现

    Tomcat应该都不陌生,我们经常会把写好的代码打包放在Tomcat里并启动,然后在浏览器里就能愉快的调用我们写的代码来实现相应的功能了,那么Tomcat是如何工作的? 一.Tomcat工作原理 我们 ...

  5. 代理模式 PROXY Surrogate 结构型 设计模式(十四)

    代理模式 PROXY 别名Surrogate 意图 为其他的对象提供一种代理以控制对这个对象的访问. 代理模式含义比较清晰,就是中间人,中介公司,经纪人... 在计算机程序中,代理就表示一个客户端不想 ...

  6. MongoDB学习(操作集合中的文档)

    文档概念 文档的数据结构和JSON基本一样. 所有存储在集合中的数据都是BSON格式. BSON是一种类json的一种二进制形式的存储格式,简称Binary JSON. 插入文档 insert()方法 ...

  7. python 面试题

    1.os.path与sys.path的区别是什么? os.path 主要用于系统文件路径的操作 sys.path 主要是python解释器的系统环境参数的操作 2.re模块中match和search方 ...

  8. 《JavaScript高级程序设计》笔记:DOM(十)

    Node类型 nodeType以下是一些重要的nodeType的取值:1: 元素element2: 属性attr3: 文本text8: 注释comments9: 文档document nodeName ...

  9. (一) Keras 一元线性回归

    视频学习来源 https://www.bilibili.com/video/av40787141?from=search&seid=17003307842787199553 笔记 环境为 an ...

  10. iBatis第五章:事务管理

    ---------------------------- 1.什么是事务 ------------------------------ 什么是事务? 需要注意的是,事务的概念不是针对某个特定的数据库的 ...