2018 icpc 青岛
https://zoj.pintia.cn/contests/91827364639/problems
C
要把这两个二进制串变为相同,需要先看哪些位置不同,设为数组c,某位为1则两位不同。
分1形成两段、四段或者更多段来考虑。
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <stack>
#include <vector>
#include <set>
#include <cmath>
#include <queue>
#include <map>
#define ll long long
#define ld double
#define lson rt << 1, l, m
#define pi acos(-1)
#define rson rt << 1 | 1, m + 1, r
#define fo(i, l, r) for (long long i = l; i <= r; i++)
#define fd(i, l, r) for (long long i = r; i >= l; i--)
#define mem(x) memset(x, 0, sizeof(x))
#define eps 1e-10
using namespace std;
const ll maxn = ;
const ll mod = ;
ll read()
{
ll x = , f = ;
char ch = getchar();
while (!(ch >= '' && ch <= ''))
{
if (ch == '-')
f = -;
ch = getchar();
};
while (ch >= '' && ch <= '')
{
x = x * + (ch - '');
ch = getchar();
};
return x * f;
}
int n,m;
char s[maxn],t[maxn];
int pt[];
ll ans;
int main()
{ int T;
T = read();
int tt = ;
while (T--)
{
ans=;
n=read();
scanf("%s",s+);
scanf("%s",t+);
fo(i,,n){
s[i]-='';
t[i]-='';
s[i] ^= t[i];
}
int cnt = ;
fo(i,,n){
if(s[i]&&!s[i-]){
pt[++cnt]=i;
}
if(s[i]&&!s[i+]){
pt[++cnt]=i;
}
if(cnt>)break;
}
if(cnt>){
printf("0\n");
continue;
}
if(cnt==){
ans=(ll)n*(n+)/;
}
if(cnt==){
ans=n+n-;
}
if(cnt==){
ans=;
}
printf("%d\n",ans); } return ;
}
M
递归,碰到循环节就停止。
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <stack>
#include <vector>
#include <set>
#include <cmath>
#include <queue>
#include <map>
#define ll long long
#define ld double
#define lson rt << 1, l, m
#define pi acos(-1)
#define rson rt << 1 | 1, m + 1, r
#define fo(i, l, r) for (long long i = l; i <= r; i++)
#define fd(i, l, r) for (long long i = r; i >= l; i--)
#define mem(x) memset(x, 0, sizeof(x))
#define eps 1e-10
using namespace std;
const ll maxn = ;
const ll mod = ;
ll read()
{
ll x = , f = ;
char ch = getchar();
while (!(ch >= '' && ch <= ''))
{
if (ch == '-')
f = -;
ch = getchar();
};
while (ch >= '' && ch <= '')
{
x = x * + (ch - '');
ch = getchar();
};
return x * f;
}
ll x,k;
ll f[] = {,,,,,,,,,};
ll g(int d,ll x){
if(d==) return x;
if(x==||x==){
return x^(d&);
}
ll ret = ;
while(x){
ret += f[x%];
x /= ;
}
return g(d-,ret);
}
int main()
{ int T;
T = read();
int tt = ;
while (T--)
{
x=read();k=read();
printf("%lld\n",g(k,x));
}
return ;
}
J
正好买m本书,还要带的钱最多。
考虑到,如果跳过若干本书,买一本,那把后一本书换成一开始跳过的书,答案会增加。
即,不存在这样的情况,买的书肯定是从1开始到m。
这个时候答案依然可能增加,要保证之后买不了书,就是加上之后价格最小的那本书-1
再判断一些特殊情况就可以。
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <stack>
#include <vector>
#include <set>
#include <cmath>
#include <queue>
#include <map>
#define ll long long
#define ld double
#define lson rt << 1, l, m
#define pi acos(-1)
#define rson rt << 1 | 1, m + 1, r
#define fo(i, l, r) for (long long i = l; i <= r; i++)
#define fd(i, l, r) for (long long i = r; i >= l; i--)
#define mem(x) memset(x, 0, sizeof(x))
#define eps 1e-10
using namespace std;
const ll maxn = ;
const ll mod = ;
ll read()
{
ll x = , f = ;
char ch = getchar();
while (!(ch >= '' && ch <= ''))
{
if (ch == '-')
f = -;
ch = getchar();
};
while (ch >= '' && ch <= '')
{
x = x * + (ch - '');
ch = getchar();
};
return x * f;
}
int n,m;
ll a[maxn],ans;
int main()
{ int T;
T = read();
int tt = ;
while (T--)
{
ans=;
n=read();m=read();
fo(i,,n){
a[i]=read();
if(!a[i]){
i--;
n--;
m--;
}
}
if(m<||m>n){
printf("Impossible\n");
continue;
}
if(m==n){
printf("Richman\n");
continue;
}
fo(i,,m){
ans += a[i];
}
ll mn = 1e10;
fo(i,m+,n){
mn = min(mn,a[i]);
}
mn--;
ans+=mn;
printf("%lld\n",ans);
} return ;
}
E
试着将操作进行分解,前进n次,倒退n次,把这些操作全部换成前进1次,倒退1次的操作,答案不会变劣。
首先二分,检验的时候,不断往前走,如果某个时刻发现前一个点不能满足要求,就在这两个点之间反复的跳,注意考虑最后一个点的情况。
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <stack>
#include <vector>
#include <set>
#include <cmath>
#include <queue>
#include <map>
#define ll long long
#define ld double
#define lson rt << 1, l, m
#define pi acos(-1)
#define rson rt << 1 | 1, m + 1, r
#define fo(i, l, r) for (long long i = l; i <= r; i++)
#define fd(i, l, r) for (long long i = r; i >= l; i--)
#define mem(x) memset(x, 0, sizeof(x))
#define eps 1e-10
using namespace std;
const ll maxn = ;
const ll mod = ;
ll read()
{
ll x = , f = ;
char ch = getchar();
while (!(ch >= '' && ch <= ''))
{
if (ch == '-')
f = -;
ch = getchar();
};
while (ch >= '' && ch <= '')
{
x = x * + (ch - '');
ch = getchar();
};
return x * f;
}
ll a[maxn],b[maxn],c[maxn];
ll n,m,mx;
bool check(ll t){
int nown = n;
fo(i,,n){
b[i]=t/a[i];
if(b[i]*a[i]<t)b[i]++;
}
b[n+]=;
while(nown>=&&b[nown]==)nown--;
fo(i,,nown+){
if(i<=n)c[i]=;
else c[i]=;
if(b[i-]>c[i-]){
c[i] += b[i-]-c[i-];
c[i-]=b[i-];
}
if(i==n&&c[i]>b[i])c[i]--; }
ll ret = ;
fo(i,,nown+){
ret += c[i];
if(ret > m) return false;
}
return true;
}
int main()
{ int T;
T = read();
int tt = ;
while (T--)
{
n=read();m=read();
mx=;
fo(i,,n){
a[i]=read();
mx=max(mx,a[i]);
}
ll lp = ,rp = mx*m,mid,ans=;
while(lp<=rp){
mid = (lp + rp) >> ;
if(check(mid)){
ans = mid;
lp = mid + ;
}else{
rp = mid - ;
}
}
printf("%lld\n",ans);
} return ;
}
F
首先,n个人最多打n-1轮,奇数个人不能打。
2、4个人都能打,然后发现6个人连两轮都打不了。
一开始是 2 1 4 3 6 5,假如说之后1个3打,按照只能要求1 2 3 4之间有比赛,5还是只能跟6打,因为第二轮与人的序号无关,这时候怎么调整都是徒劳。
人数是2^n的时候比较好安排,轮换一下就可以。
人数不是2^n的时候,还是按照2^n的情况排个表,因为之前就是保证字典序最小,所以编号大的都尽量出现在后面,如果这个时候表中出现了不得不跟一个不存在的大号打的情况,这个时候就安排不了了。
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include <set>
#include <queue>
#define ll long long
#define ld long double
#define lson l,m,rt<<1
#define pi acos(-1)
#define rson m+1,r,rt<<1|1
#define fo(i,l,r) for(int i = l;i <= r;i++)
#define fd(i,l,r) for(int i = r;i >= l;i--)
#define mem(x) memset(x,0,sizeof(x))
#define eps 3e-11
using namespace std;
const int maxn = ;
const ll inf = 1e9;
const ll mod = ;
ll read() {
ll x=,f=;
char ch=getchar();
while(!(ch>=''&&ch<='')) {
if(ch=='-')f=-;
ch=getchar();
};
while(ch>=''&&ch<='') {
x=x*+(ch-'');
ch=getchar();
};
return x*f;
}
int n,k;
int a[][];
int main() {
a[][]=a[][]=;
a[][]=a[][]=;
for(int t = ;t <= ;t <<= ){
fo(i,,t){
fo(j,,t){
a[t+i][t+j] = a[i][j];
a[t+i][j] = a[i][t+j] = a[i][j] + t;
}
}
}
int T=read();
while(T--){
n=read();k=read();
if((n&)||k>=n){
puts("Impossible");
continue;
}
bool flag = false;
fo(i,,k){
fo(j,,n){
if(a[i+][j] > n)flag=true;
}
}
if(flag){
puts("Impossible");
continue;
}
fo(i,,k){
fo(j,,n){
printf("%d",a[i+][j]);
putchar(j==n?'\n':' ');
}
}
}
return ;
}
D
枚举两个数的第一位,之后所有的位都确定了。
注意两位数不能有前导零,每一位的范围不能超。
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include <set>
#include <queue>
#define ll long long
#define ld long double
#define lson l,m,rt<<1
#define pi acos(-1)
#define rson m+1,r,rt<<1|1
#define fo(i,l,r) for(int i = l;i <= r;i++)
#define fd(i,l,r) for(int i = r;i >= l;i--)
#define mem(x) memset(x,0,sizeof(x))
#define eps 3e-11
using namespace std;
const int maxn = ;
const ll inf = 1e9;
const ll mod = ;
ll read() {
ll x=,f=;
char ch=getchar();
while(!(ch>=''&&ch<='')) {
if(ch=='-')f=-;
ch=getchar();
};
while(ch>=''&&ch<='') {
x=x*+(ch-'');
ch=getchar();
};
return x*f;
}
ll n,m,len;
char s[maxn];
int a[maxn],b[maxn];
bool flag;
inline int check(int u,int v,int t){
if(a[u]*b[v]==s[t])return ;
if(t<len&&s[t]&&(s[t]*+s[t+])==a[u]*b[v]) return ;
return ;
}
inline int dv(int v,int t){
if(s[t]%v==) return s[t]/v;
if(t<len&&(s[t]*+s[t+])%v==) return (s[t]*+s[t+])/v;
return -;
}
bool check(int st){
int t = st,u=,v=,sgn;
while(t<=len){
v++;
if(v>m){
v=;
u++;
}
if(u>n)break;
if(u==){
b[v]=dv(a[u],t);
if(b[v]==-||b[v]>=)return false;
}else if(v==){
a[u] = dv(b[v],t);
if(a[u]==-||a[u]>=)return false;
}else{
sgn=check(u,v,t);
if(!sgn)return false;
}
t++;
if(a[u]*b[v]>=)t++;
}
return u==n&&v==m&&t==len+;
}
bool gao(){
int sgn;
fo(i,,){
fo(j,,){
a[]=i;b[]=j;
sgn=check(,,);
if(!sgn)continue;
if(check(sgn+))return true;
}
}
return false;
}
int main() {
int T=read();
while(T--){
flag=false;
n=read();m=read();
scanf("%s",s+);
len = strlen(s+);
if(n*m>len||n*m*<len){
puts("Impossible");
continue;
}
fo(i,,len) s[i]-='';
if(gao()){
fo(i,,n){
putchar(''+a[i]);
}
putchar(' ');
fo(i,,m){
putchar(''+b[i]);
}
putchar('\n');
}else{
puts("Impossible");
}
}
return ;
}
2018 icpc 青岛的更多相关文章
- 2018 icpc 青岛网络赛 J.Press the Button
Press the Button Time Limit: 1 Second Memory Limit: 131072 KB BaoBao and DreamGrid are playing ...
- 2018 ICPC青岛网络赛 B. Red Black Tree(倍增lca好题)
BaoBao has just found a rooted tree with n vertices and (n-1) weighted edges in his backyard. Among ...
- 2018 ICPC 沈阳网络赛
2018 ICPC 沈阳网络赛 Call of Accepted 题目描述:求一个算式的最大值与最小值. solution 按普通算式计算方法做,只不过要同时记住最大值和最小值而已. Convex H ...
- 2018 ICPC 徐州网络赛
2018 ICPC 徐州网络赛 A. Hard to prepare 题目描述:\(n\)个数围成一个环,每个数是\(0\)~\(2^k-1\),相邻两个数的同或值不为零,问方案数. solution ...
- 2018 ICPC Asia Singapore Regional A. Largest Triangle (计算几何)
题目链接:Kattis - largesttriangle Description Given \(N\) points on a \(2\)-dimensional space, determine ...
- 2018 ICPC Pacific Northwest Regional Contest I-Inversions 题解
题目链接: 2018 ICPC Pacific Northwest Regional Contest - I-Inversions 题意 给出一个长度为\(n\)的序列,其中的数字介于0-k之间,为0 ...
- 2016 ICPC青岛站---k题 Finding Hotels(K-D树)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5992 Problem Description There are N hotels all over ...
- 2018.9青岛网络预选赛(B)
传送门:Problem(B) https://www.cnblogs.com/violet-acmer/p/9664805.html 参考资料: https://blog.csdn.net/qq_40 ...
- 2018.9青岛网络预选赛(K)
传送门:Problem K https://www.cnblogs.com/violet-acmer/p/9664805.html 题意: 给你n个数,找出满足条件的最多的数的个数. 题解: 满足条件 ...
随机推荐
- 日语能力测试N1、N2级听力必备核心词汇—头发篇
日语能力测试N1.N2级听力必备核心词汇—头发篇 要想在短时间内迅速提高日语听力能力的水平,除了每天练习(用2倍的速度)真题之外,掌握听力的核心词汇也是一个必要的好方法. 髪(かみ)--头发髪型(かみ ...
- shell脚本之删除内容相同的重复文件
#!/bin/bash #!当前文件夹下,删除内容相同的重复文件,只保留重复文件中的一个. ls -lS --time-style=long-iso | awk 'BEGIN{ getline;get ...
- SOA架构简介
一. 什么是SOA 架构 SOA是一种架构模型,它可以根据需求通过网络对松散耦合的粗粒度应用组件进行分布式部署.组合和使用.服务层是SOA的基础,可以直接被应用调用,从而有效控制系统中与软件代理交互的 ...
- adb shell命令模拟按键/输入input使用keycode 列表详解
在adb shell里有一个非常使用的命令,模拟按键输入,这里首先不要理解为是键盘的模拟按键,下面命令的使用和键值做一个详解. input命令格式 adb shell input keyevent & ...
- 利用python自动发邮件
工作中有时长时间运行代码时需要监控进度,或者需要定期发送固定格式邮件时,可以使用下面定义的邮件函数. 该函数调用了outlook和qqmail的接口,只需要放置到python的环境目录中即可 impo ...
- java知识
DiskFileUploadhttps://blog.csdn.net/FightingITPanda/article/details/79742631 import java.util.ArrayL ...
- c字符串函数
1. bcmp(3) 类ma似于strncmp(3) 但是比较结果不一定是两个字符的ascii码之差. 返回值:相等0,不相等非零(不一定是-1) 2.bcopy(3)类ma似于strncpy(3) ...
- Python核心技术与实战——十二|Python的比较与拷贝
我们在前面已经接触到了很多Python对象比较的例子,例如这样的 a = b = a == b 或者是将一个对象进行拷贝 l1 = [,,,,] l2 = l1 l3 = list(l1) 那么现在试 ...
- antd表格分页
<Table bordered loading={loading} dataSource={list} pagination={{ showSizeChanger: true, total: d ...
- node.js入门学习(五)--Demo模块化改造
1.node.js中模块的分类 1)node.js内置模块(核心,原生) 所有内置模块在安装node.js时就已经编译成二进制文件,可以直接加载运行(速度较快),部分内置模块,在node.exe这个进 ...