前言
第一次参加div3,不知道这场是不是算简单的,感觉就是暴力
一、A. Number Transformation
是否是因数,是则分解为 d * 1 * m
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pr;
const int inf =0x3f3f3f3f;
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define in freopen("in.txt","r",stdin)
#define out freopen("out.txt","w",stdout)
#define ms(x,a) memset(x,a,sizeof(x))
#define ll long long
#define pb push_back
#define pr pair<int,int>
#define debug printf("%d %s\n",__LINE__,__FUNCTION__)
#define rep(i, a, n) for(int i=a; i<n; i++)
#define rg register int//卡常
#define ONLINE_JUDGE
const int mod=1e9+7;
const int maxn=2e6+10;
const int maxe=1e6+5;
int n,m,a[maxn];
int tot;
void solve()
{
scanf("%d %d",&n,&m);
if(m%n==0){
int tmp=m/n;
printf("1 %d\n",tmp);
}else{
printf("0 0\n");
}
}
int main()
{
int t=1;
scanf("%d",&t);
while(t--){
solve();
}
return 0;
}
二、B. Dictionary
题目要求,2位的,aa bb这种的不存在
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pr;
const int inf =0x3f3f3f3f;
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define in freopen("in.txt","r",stdin)
#define out freopen("out.txt","w",stdout)
#define ms(x,a) memset(x,a,sizeof(x))
#define ll long long
#define pb push_back
#define pr pair<int,int>
#define debug printf("%d %s\n",__LINE__,__FUNCTION__)
#define rep(i, a, n) for(int i=a; i<n; i++)
#define rg register int//卡常
#define ONLINE_JUDGE
const int mod=1e9+7;
const int maxn=2e6+10;
const int maxe=1e6+5;
int n,m,a[maxn];
int tot;
void solve()
{
vector<int> ans;
cin>>n;
//scanf("%d",&n);
string s;
for(int i=1;i<=n;i++){
cin>>s;
int t=0;
for(int j=0;j<s.size();j++){
t*=26;
t+=(s[j]-'a');
}
t-=(s[0]-'a');
if(s[1]<s[0]) t++;
ans.pb(t);
}
for(int i=0;i<ans.size();i++) printf("%d\n",ans[i]);
}
int main()
{
IOS;
int t=1;
//scanf("%d",&t);
while(t--){
solve();
}
return 0;
}
三、C. Infinite Replacement
t里有a可以无穷递归下去,只为一个a例外
其他的就是2的n次幂
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pr;
const int inf =0x3f3f3f3f;
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define in freopen("in.txt","r",stdin)
#define out freopen("out.txt","w",stdout)
#define ms(x,a) memset(x,a,sizeof(x))
#define ll long long
#define pb push_back
#define pr pair<int,int>
#define debug printf("%d %s\n",__LINE__,__FUNCTION__)
#define rep(i, a, n) for(int i=a; i<n; i++)
#define rg register int//卡常
#define ONLINE_JUDGE
const int mod=1e9+7;
const int maxn=2e6+10;
const int maxe=1e6+5;
int n,m,a[maxn];
int tot;
char s1[55],s2[55];
void solve()
{
scanf("%s",s1);
scanf("%s",s2);
if(s2[0]=='a' && strlen(s2)==1){
printf("1\n");return;
}
for(int i=0;i<strlen(s2);i++){
if(s2[i]=='a'){
printf("-1\n");return;
}
}
ll ans=pow(2,strlen(s1));
printf("%lld\n",ans);
}
int main()
{
int t=1;
scanf("%d",&t);
while(t--){
solve();
}
return 0;
}
四、D. A-B-C Sort
因为从A末尾取出入B中间,从B中间取出入C尾部
简单的分析一下,发现可以想象成2个栈,两个栈的顶部相对,在栈里面的一定要比现在在栈外面的大,不然取出的时候一定是在栈顶的先到C的尾部,导致不会排序成功
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pr;
const int inf =0x3f3f3f3f;
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define in freopen("in.txt","r",stdin)
#define out freopen("out.txt","w",stdout)
#define ms(x,a) memset(x,a,sizeof(x))
#define ll long long
#define pb push_back
#define pr pair<int,int>
#define debug printf("%d %s\n",__LINE__,__FUNCTION__)
#define rep(i, a, n) for(int i=a; i<n; i++)
#define rg register int//卡常
#define ONLINE_JUDGE
const int mod=1e9+7;
const int maxn=2e5+10;
const int maxe=1e6+5;
int n,m,a[maxn];
int tot;
void solve()
{
scanf("%d",&n);
stack<int> s1,s2;
int tmp=0;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
s1.push(1e9);s2.push(1e9);
for(int i=n;i>=1;i--){
if(tmp==0){
tmp=a[i];
}else{
int t=a[i];
if(tmp>t)swap(tmp,t);
if(s1.top()>=tmp && s2.top()>=t && s1.top()>=t && s2.top()>=tmp){
s1.push(tmp);s2.push(t);
}else{
printf("NO\n");return;
}
tmp=0;
}
}
if(tmp!=0){
if(tmp<=s1.top() && tmp<=s2.top()){
printf("YES\n");return;
}else{
printf("NO\n");return;
}
}
printf("YES\n");
}
int main()
{
int t=1;
scanf("%d",&t);
while(t--){
solve();
}
return 0;
}
五、E. Breaking the Wall
模拟一下,因为每次操作最多只会影响到3个单位,所以考虑2个之间不会互相影响的作为整个考虑的上界
相隔一个的考虑一下
相邻的考虑一下,代码多考虑了一次(反正复杂度没超,当时也懒得改了)
O(n)
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pr;
const int inf =0x3f3f3f3f;
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define in freopen("in.txt","r",stdin)
#define out freopen("out.txt","w",stdout)
#define ms(x,a) memset(x,a,sizeof(x))
#define ll long long
#define pb push_back
#define pr pair<int,int>
#define debug printf("%d %s\n",__LINE__,__FUNCTION__)
#define rep(i, a, n) for(int i=a; i<n; i++)
#define rg register int//卡常
#define ONLINE_JUDGE
const int mod=1e9+7;
const int maxn=2e5+10;
const int maxe=1e6+5;
int n,m,a[maxn];
int tot;
void solve()
{
scanf("%d",&n);
int minn1=1e9,minn2=1e9;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
if(a[i]<minn1) minn2=minn1,minn1=a[i];
else if(a[i]<minn2) minn2=a[i];
}
int bottom=minn1/2+minn2/2;
if(minn1&1)bottom++;
if(minn2&1)bottom++;
if(n==2){
if(a[1]>a[2])swap(a[1],a[2]);
int ans=0;
if(a[1]<=(a[2]+1)/2){
ans=(a[2]+1)/2;
}else{
int x=(2*a[1]-a[2]+1)/3;
ans=(a[2]-x+1)/2;
ans+=x;
}
printf("%d\n",ans);return;
}
for(int i=1;i<=n-2;i++){
int ans=0;
int x=a[i],y=a[i+1],z=a[i+2];
ans=min(x,z)+(max(x,z)-min(x,z)+1)/2;
if(x>y)swap(x,y);
int ans1=0;
if(x<=(y+1)/2){
ans1=(y+1)/2;
}else{
int tmp=(2*x-y+1)/3;
ans1=(y-tmp+1)/2;
ans1+=tmp;
}
x=a[i+1];y=a[i+2];
if(x>y)swap(x,y);
int ans2=0;
if(x<=(y+1)/2){
ans2=(y+1)/2;
}else{
int tmp=(2*x-y+1)/3;
ans2=(y-tmp+1)/2;
ans2+=tmp;
}
bottom=min(bottom,min(ans,min(ans1,ans2)));
}
printf("%d\n",bottom);
}
int main()
{
int t=1;
//scanf("%d",&t);
while(t--){
solve();
}
return 0;
}
六、F. Desktop Rearrangement
div3的f都这么简单吗…
纯纯的模拟题
当然我这个写法是暴力写法
可以考虑树状数组或者线段树啥的区间查询
但是复杂度没超也能过…
比赛在有限的时间做最多的事情是最优的(逃)
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pr;
const int inf =0x3f3f3f3f;
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define in freopen("in.txt","r",stdin)
#define out freopen("out.txt","w",stdout)
#define ms(x,a) memset(x,a,sizeof(x))
#define ll long long
#define pb push_back
#define pr pair<int,int>
#define debug printf("%d %s\n",__LINE__,__FUNCTION__)
#define rep(i, a, n) for(int i=a; i<n; i++)
#define rg register int//卡常
#define ONLINE_JUDGE
const int mod=1e9+7;
const int maxn=1e3+10;
const int maxe=1e6+5;
int n,m,q,a[maxn],mp[maxn][maxn];
int tot;
char s[maxn];
void solve()
{
scanf("%d %d %d",&n,&m,&q);
tot=0;
for(int i=1;i<=n;i++){
scanf("%s",s);
int len=strlen(s);
for(int j=1;j<=m;j++){
if(s[j-1]=='.') mp[i][j]=0;
else mp[i][j]=1,a[j]++,tot++;
}
}
int x,y;
for(int __=1;__<=q;__++){
scanf("%d %d",&x,&y);
if(mp[x][y]){
mp[x][y]=0;a[y]--;tot--;
}else{
mp[x][y]=1;a[y]++;tot++;
}
int k=tot/n;
int off=tot-k*n;
int ans=0;
for(int i=1;i<=k;i++){
ans+=n-a[i];
}
for(int i=1;i<=off;i++){
if(mp[i][k+1]==0){
ans++;
}
}
printf("%d\n",ans);
}
}
int main()
{
int t=1;
//scanf("%d",&t);
while(t--){
solve();
}
return 0;
}
七、G. Remove Directed Edges
就是每个点都需要删一条入边和一条出边(没有就不删)
考虑枚举的话O(x2)的
那么从本质上来看就是如果这个点有两条以上的入边的话,那么每一个“父节点”都可以到达他
同样的,他有两条以上的出边的话,那么他的每一个“儿子节点”他都能到
而图又是无环图,所以dfs不会有危险
那么顺着这个考虑dp(看到了tag…(逃
考虑每个点为起点可以到达的最大集合
转移方程
if(可以转移) dp[i]=max(dp[i],dp[son]+1);
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pr;
const int inf =0x3f3f3f3f;
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define in freopen("in.txt","r",stdin)
#define out freopen("out.txt","w",stdout)
#define ms(x,a) memset(x,a,sizeof(x))
#define ll long long
#define pb push_back
#define pr pair<int,int>
#define debug printf("%d %s\n",__LINE__,__FUNCTION__)
#define rep(i, a, n) for(int i=a; i<n; i++)
#define rg register int//卡常
#define ONLINE_JUDGE
const int mod=1e9+7;
const int maxn=2e5+10;
const int maxe=1e6+5;
int n,m;
vector<int> g[maxn];
int ind[maxn],outd[maxn];
int dp[maxn];
void dfs(int now)
{
if(dp[now]!=-1) return;
if(outd[now]>=2){
for(int i=0;i<g[now].size();i++){
int v=g[now][i];
if(ind[v]>=2){
if(dp[v]==-1){
dfs(v);
}
dp[now]=max(dp[v]+1,dp[now]);
}
}
}
dp[now]=max(dp[now],1);
}
void solve()
{
scanf("%d %d",&n,&m);
int x,y;
for(int i=1;i<=n;i++){
ind[i]=outd[i]=0;dp[i]=-1;
}
for(int i=1;i<=m;i++){
scanf("%d %d",&x,&y);
g[x].pb(y);
ind[y]++;outd[x]++;
}
for(int i=1;i<=n;i++) dfs(i);
int ans=0;
for(int i=1;i<=n;i++){
ans=max(ans,dp[i]);
}
printf("%d",ans);
}
int main()
{
int t=1;
//scanf("%d",&t);
while(t--){
solve();
}
return 0;
}