2018 Multi-University Training Contest - Team 1 题解
| Solved | A | HDU 6298 | Maximum Multiple |
| Solved | B | HDU 6299 | Balanced Sequence |
| Solved | C | HDU 6300 | Triangle Partition |
| Solved | D | HDU 6301 | Distinct Values |
| E | HDU 6302 | Maximum Weighted Matching | |
| F | HDU 6303 | Period Sequence | |
| Solved | G | HDU 6304 | Chiaki Sequence Revisited |
| Solved | H | HDU 6305 | RMQ Similar Sequence |
| I | HDU 6306 | Lyndon Substring | |
| J | HDU 6307 | Turn Off The Light | |
| Solved | K | HDU 6308 | Time Zone |
A 找规律
发现只有3和4的倍数有存在答案
#include <bits/stdc++.h>
#define ll long long
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define rep(ii,a,b) for(int ii=a;ii<=b;ii++)
#pragma comment(linker, "/stack:200000000")
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#pragma GCC optimize("unroll-loops") using namespace std;
const int maxn=1e5+10;
const int maxm=1e6+10;
const int INF=0x3f3f3f3f;
ll casn,n,m,k;
#define tpyeinput ll
inline char nc() {static char buf[1000000],*p1=buf,*p2=buf;return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;}
inline void read(tpyeinput &sum) {char ch=nc();sum=0;while(!(ch>='0'&&ch<='9')) ch=nc();while(ch>='0'&&ch<='9') sum=(sum<<3)+(sum<<1)+(ch-48),ch=nc();}
inline void read(tpyeinput &num1,tpyeinput &num2){read(num1);read(num2);}
inline void read(tpyeinput &num1,tpyeinput &num2,tpyeinput &num3){read(num1);read(num2);read(num3);}
inline void read(tpyeinput &num1,tpyeinput &num2,tpyeinput &num3,tpyeinput &num4){read(num1);read(num2);read(num3);read(num4);}
int main(){
//#define test
#ifdef test
freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);
#endif
read(casn);
while(casn--){
read(n);
if(n>=3&&n%3==0) printf("%lld\n",((n/3ll)*(n/3ll)*(n/3ll)));
else if(n>=4&&n%4==0) printf("%lld\n",n*n*n/32ll);
else puts("-1");
} #ifdef test
fclose(stdin);fclose(stdout);system("out.txt");
#endif
return 0;
}
B 贪心
去掉已经配对的,对于剩下 的,左边括号>右括号的放在左边,如果同样是左括号>右括号,不需要管哪个左括号多,只需要管哪个右括号少,右括号少的放在左边
#include <bits/stdc++.h>
#define ll long long
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define rep(ii,a,b) for(int ii=a;ii<=b;ii++)
using namespace std;
const int maxn=1e5+10;
const int maxm=1e6+10;
const int INF=0x3f3f3f3f;
int casn,n,m,k;
#define tpyeinput int
inline char nc() {static char buf[1000000],*p1=buf,*p2=buf;return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;}
inline void read(tpyeinput &sum) {char ch=nc();sum=0;while(!(ch>='0'&&ch<='9')) ch=nc();while(ch>='0'&&ch<='9') sum=(sum<<3)+(sum<<1)+(ch-48),ch=nc();}
inline void read(tpyeinput &num1,tpyeinput &num2){read(num1);read(num2);}
inline void read(tpyeinput &num1,tpyeinput &num2,tpyeinput &num3){read(num1);read(num2);read(num3);}
inline void read(tpyeinput &num1,tpyeinput &num2,tpyeinput &num3,tpyeinput &num4){read(num1);read(num2);read(num3);read(num4);}
string str[maxn];
struct node {
int a,b;
}s[maxn];
int cmp(node &a,node &b){
int x=min(a.a,b.b),y=min(a.b,b.a);
return x>y||x==y&&a.a>b.a;
}
int main(){
//#define test
#ifdef test
freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);
#endif
IO;
cin>>casn;
while(casn--){
cin>>n;
rep(i,1,n){
cin>>str[i];
}
int ans=0;
rep(i,1,n){
int a=0,b=0;
rep(j,0,str[i].size()-1){
if(str[i][j]=='(') a++;
else if(str[i][j]==')'){
if(a>0) a--,ans+=2;
else b++;
}
s[i]=(node){a,b};
}
}
sort(s+1,s+1+n,cmp);
int a=0,b=0;
rep(i,1,n){
if(a>=s[i].b){
ans+=s[i].b*2;
a-=s[i].b;
}else {
ans+=a*2;
a=0;
}
a+=s[i].a;
}
cout<<ans<<endl;
}
#ifdef test
fclose(stdin);fclose(stdout);system("out.txt");
#endif
return 0;
}
C 画图,找规律
保证三点不共线,画图尝试之后发现规律,把点排序即可(这道题用输入挂反而会WA?)
#include <bits/stdc++.h>
#define ll long long
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define rep(ii,a,b) for(int ii=a;ii<=b;ii++)
using namespace std;
const int maxn=1e5+10;
const int maxm=1e6+10;
const int INF=0x3f3f3f3f;
int casn,n,m,k;
//#define tpyeinput int
//inline char nc() {static char buf[1000000],*p1=buf,*p2=buf;return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;}
//inline void read(tpyeinput &sum) {char ch=nc();sum=0;while(!(ch>='0'&&ch<='9')) ch=nc();while(ch>='0'&&ch<='9') sum=(sum<<3)+(sum<<1)+(ch-48),ch=nc();}
//inline void read(tpyeinput &num1,tpyeinput &num2){read(num1);read(num2);}
//inline void read(tpyeinput &num1,tpyeinput &num2,tpyeinput &num3){read(num1);read(num2);read(num3);}
//inline void read(tpyeinput &num1,tpyeinput &num2,tpyeinput &num3,tpyeinput &num4){read(num1);read(num2);read(num3);read(num4);}
struct node {
int x,y,id;
}p[maxn];
bool cmp(node &a,node& b){
if(a.x==b.x) return a.y<b.y;
return a.x<b.x;
}
int main(){
//#define test
#ifdef test
freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);
#endif
IO;
cin>>casn;
while(casn--){
cin>>n;
rep(i,1,3*n){
int a,b;
cin>>a>>b;
p[i]=(node){a,b,i};
}
sort(p+1,p+1+3*n,cmp);
k=1;
rep(i,1,n){
rep(j,1,3){
cout<<p[k++].id<<' ';
}
cout<<endl;
}
}
#ifdef test
fclose(stdin);fclose(stdout);system("out.txt");
#endif
return 0;
}
D 双指针/贪心+小根堆维护mex
排序要求的区间,然后双指针遍历所有即可,用priority_queue维护当前双指针内的mex
卡时间,建议上输入挂
#include <bits/stdc++.h>
#define ll long long
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define rep(ii,a,b) for(int ii=a;ii<=b;ii++)
using namespace std;
const int maxn=1e5+10;
const int maxm=1e6+10;
const int INF=0x3f3f3f3f;
const int mod=1e9+7;
int casn,n,m,k;
#define tpyeinput int
inline char nc() {static char buf[1000000],*p1=buf,*p2=buf;return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;}
inline void read(tpyeinput &sum) {char ch=nc();sum=0;while(!(ch>='0'&&ch<='9')) ch=nc();while(ch>='0'&&ch<='9') sum=(sum<<3)+(sum<<1)+(ch-48),ch=nc();}
inline void read(tpyeinput &num1,tpyeinput &num2){read(num1);read(num2);}
inline void read(tpyeinput &num1,tpyeinput &num2,tpyeinput &num3){read(num1);read(num2);read(num3);}
inline void read(tpyeinput &num1,tpyeinput &num2,tpyeinput &num3,tpyeinput &num4){read(num1);read(num2);read(num3);read(num4);}
int ans[maxn];
int pos[maxn];
set<int>num;
int main(){
//#define test
#ifdef test
freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);
#endif
read(casn);
while(casn--){
read(n,m);
rep(i,1,n) {
ans[i]=1;
pos[i]=i;
num.insert(i);
}
rep(i,1,m){
int a,b;
read(a,b);
pos[b]=min(pos[b],a);
}
for(int i=n-1;i;i--){
pos[i]=min(pos[i],pos[i+1]);
}
int last=1;
rep(i,1,n){
while(last<pos[i]){
num.insert(ans[last]);
last++;
}
ans[i]=*num.begin();
num.erase(ans[i]);
}
rep(i,1,n){
printf("%d%c",ans[i]," \n"[i==n]);
}
} #ifdef test
fclose(stdin);fclose(stdout);system("out.txt");
#endif
return 0;
}
G 找规律+打表倍增
找规律发现,数列中$X$的出现次数是$lowbit(X)$,于是对于出现次数相同的值(也就是$lowbit(x)$相同)的数,构成了等差数列..
原数列就是很多个等差数列构成的了,然后先预处理一下值,每次有多少个不同的等差数列,求和即可...
具体看代码
#include <bits/stdc++.h>
#define ll long long
#define show(x) cout<<#x<<"="<<x<<endl
#define show2(x,y) cout<<#x<<"="<<x<<" "<<#y<<"="<<y<<endl
#define show3(x,y,z) cout<<#x<<"="<<x<<" "<<#y<<"="<<y<<" "<<#z<<"="<<z<<endl
#define show4(w,x,y,z) cout<<#w<<"="<<w<<" "<<#x<<"="<<x<<" "<<#y<<"="<<y<<" "<<#z<<"="<<z<<endl
#define show5(v,w,x,y,z) cout<<#v<<" "<<v<<" "<<#w<<"="<<w<<" "<<#x<<"="<<x<<" "<<#y<<"="<<y<<" "<<#z<<"="<<z<<endl
#define showa(a,b) cout<<#a<<'['<<b<<"]="<<a[b]<<endl
#define print(x) cout<<#x<<"="<<x<<' '
#define ptline() cout<<endl
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define rep(ii,a,b) for(int ii=a;ii<=b;ii++)
using namespace std;
const int maxn=1e5+10;
const int maxm=1e6+10;
const ll mod=1e9+7;
const int INF=0x3f3f3f3f;
ll casn,n,m,k;
#define tpyeinput ll
inline char nc() {static char buf[1000000],*p1=buf,*p2=buf;return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;}
inline void read(tpyeinput &sum) {char ch=nc();sum=0;while(!(ch>='0'&&ch<='9')) ch=nc();while(ch>='0'&&ch<='9') sum=(sum<<3)+(sum<<1)+(ch-48),ch=nc();}
inline void read(tpyeinput &num1,tpyeinput &num2){read(num1);read(num2);}
inline void read(tpyeinput &num1,tpyeinput &num2,tpyeinput &num3){read(num1);read(num2);read(num3);}
inline void read(tpyeinput &num1,tpyeinput &num2,tpyeinput &num3,tpyeinput &num4){read(num1);read(num2);read(num3);read(num4);}
ll num[maxn],p[maxn];
ll inv=(mod+1)/2;
void init(){
num[0]=p[0]=1;
rep(i,1,63){
num[i]=num[i-1]*2ll+1ll;
p[i]=p[i-1]*2ll;
}
}
ll cal(ll pos){
ll sum=0;
for(ll i=1;i<=pos;i*=2ll){
ll num=(pos-i)/(2*i);
ll m=i+num*(2ll*i);;
num=(num+1ll)%mod;
m=(m+i)%mod;
m=m*num%mod;
m=m*inv%mod;
m=m*(__builtin_ctz(i)+1ll)%mod;
sum=(sum+m)%mod;
}
return (sum+1)%mod;
}
int main(){
//#define test
#ifdef test
freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);
#endif
read(casn);
init();
while(casn--){
read(n);
n--;
if(!n){
puts("1");
continue;
}
ll tmp=n;
ll pos=0;
for(int i=62;i>=0;i--){
if(tmp>=num[i]){
tmp-=num[i];
pos+=p[i];
}
}
ll sum=cal(pos);
if(tmp){
sum=(sum+tmp%mod*(pos+1ll)%mod)%mod;
}
printf("%lld\n",sum);
}
#ifdef test
fclose(stdin);fclose(stdout);system("out.txt");
#endif
return 0;
}
H 组合数学+笛卡尔树性质
笛卡尔树的2个重要性质,
1.中序遍历等于原序列,换句话说,就是把树拍扁等价于原数列
2.区间的最大元素,就是表示了这个区间的子树的根节点
放到这个题里,就是笛卡尔树的形状和题目给的一样,问你多少种...
组合数学,dfs笛卡尔树记算总种类数,过程中需要求逆元...
代码里的这个笛卡尔树和线性推逆元是学的dls..
推导参考出题大爷:

#include <bits/stdc++.h>
#define ll long long
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define rep(ii,a,b) for(int ii=a;ii<=b;ii++)
using namespace std;
const int maxn=1e6+10;
const int maxm=1e6+10;
const int INF=0x3f3f3f3f;
const ll mod=1e9+7;
#define tpyeinput int
inline char nc() {static char buf[1000000],*p1=buf,*p2=buf;return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;}
inline void read(tpyeinput &sum) {char ch=nc();sum=0;while(!(ch>='0'&&ch<='9')) ch=nc();while(ch>='0'&&ch<='9') sum=(sum<<3)+(sum<<1)+(ch-48),ch=nc();}
inline void read(tpyeinput &num1,tpyeinput &num2){read(num1);read(num2);}
inline void read(tpyeinput &num1,tpyeinput &num2,tpyeinput &num3){read(num1);read(num2);read(num3);}
inline void read(tpyeinput &num1,tpyeinput &num2,tpyeinput &num3,tpyeinput &num4){read(num1);read(num2);read(num3);read(num4);}
int casn,n,m,k;
struct node{int l,r;}ctree[maxn];
ll inv[maxn],ans;
int stk[maxn],vis[maxn];
pair<int,int> num[maxn];
#define nd ctree[now]
int dfs(int now){
if(now==0)return 0;
int sum=dfs(nd.l)+dfs(nd.r)+1;
ans=ans*inv[sum]%mod;
// cout<<ans<<endl;
return sum;
}
void maketree(){
int top=0;
rep(i,1,n){
int now=top;
while(now&&num[stk[now-1]]>num[i]) now--;
if(now) ctree[stk[now-1]].r=i;
if(now<top) ctree[i].l=stk[now];
stk[now++]=i;
top=now;
}
}
int main(){
//#define test
#ifdef test
freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);
#endif
inv[1]=1;
rep(i,2,maxn-5)inv[i]=inv[mod%i]*(mod-mod/i)%mod;
read(casn);
while(casn--){
read(n);
rep(i,1,n){
int x;
read(x);
num[i]=make_pair(-x,i);
}
ans=inv[2]*(ll)n%mod;
// cout<<ans<<endl;
rep(i,1,n) ctree[i]=(node){0,0},vis[i]=0;
maketree();
rep(i,1,n) vis[ctree[i].l]=vis[ctree[i].r]=1;
int rt=0;
rep(i,1,n) if(vis[i]==0) {
rt=i;break;
}
dfs(rt);
printf("%lld\n",ans);
}
#ifdef test
fclose(stdin);fclose(stdout);system("out.txt");
#endif
return 0;
}
K 模拟题
难点有2个
输入,误差..
输入建议用"scanf("%d %d UTC%c%lf",&h,&m,&flag,&utc);";
也可以"cin>>h>>m>>ch>>ch>>ch>>ch>>utc";
误差就是$1.4$会被读入为$1.39999$取整变成$1.3$之类的
utc+=0.001就行了,消除误差,而且不影响答案
#include <bits/stdc++.h>
#define ll long long
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define rep(ii,a,b) for(int ii=a;ii<=b;ii++)
using namespace std;
const int maxn=1e5+10;
const int maxm=1e6+10;
const int INF=0x3f3f3f3f;
int casn,n,m,k;
int main(){
//#define test
#ifdef test
freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);
#endif
scanf("%d",&casn);
int h,m,flag,ch,x;
double y;
while(casn--){
y=0;
double tt;
scanf("%d %d UTC%c%lf",&h,&m,&flag,&tt);
tt+=0.0001;
x=(int)tt;
y=tt-x;
y*=10;
if(flag=='-') {
x=-(x+8);
y=-y;}
else x-=8;
int t1=x;
int t2=y*6;
h+=t1;
m+=t2;
if(m>=60){
m-=60;
h++;
}
if(h>=24) h-=24;
if(m<0){
m+=60;
h--;
}if(h<0){
h+=24;
}
printf("%02d:%02d\n",h,m);
} #ifdef test
fclose(stdin);fclose(stdout);system("out.txt");
#endif
return 0;
}
2018 Multi-University Training Contest - Team 1 题解的更多相关文章
- 2017 Multi-University Training Contest - Team 1 1003&&HDU 6035 Colorful Tree【树形dp】
Colorful Tree Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- 2017 Multi-University Training Contest - Team 1 1002&&HDU 6034 Balala Power!【字符串,贪心+排序】
Balala Power! Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- 2017 Multi-University Training Contest - Team 3 hdu6060 RXD and dividing
地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=6060 题目: RXD and dividing Time Limit: 6000/3000 M ...
- HDU 6038.Function-数学+思维 (2017 Multi-University Training Contest - Team 1 1006)
学长讲座讲过的,代码也讲过了,然而,当时上课没来听,听代码的时候也一脸o((⊙﹏⊙))o 我的妈呀,语文不好是硬伤,看题意看了好久好久好久(死一死)... 数学+思维题,代码懂了,也能写出来,但是还是 ...
- HDU 6166.Senior Pan()-最短路(Dijkstra添加超源点、超汇点)+二进制划分集合 (2017 Multi-University Training Contest - Team 9 1006)
学长好久之前讲的,本来好久好久之前就要写题解的,一直都没写,懒死_(:з」∠)_ Senior Pan Time Limit: 12000/6000 MS (Java/Others) Memor ...
- 2017 Multi-University Training Contest - Team 2&&hdu 6047 Maximum Sequence
Maximum Sequence Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- 2017 Multi-University Training Contest - Team 9 1005&&HDU 6165 FFF at Valentine【强联通缩点+拓扑排序】
FFF at Valentine Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- 2017 Multi-University Training Contest - Team 9 1004&&HDU 6164 Dying Light【数学+模拟】
Dying Light Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Tot ...
- 2017 Multi-University Training Contest - Team 9 1003&&HDU 6163 CSGO【计算几何】
CSGO Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
随机推荐
- java8的Streams
首先看一个问题:在这个task集合中一共有多少个OPEN状态的?计算出它们的points属性和.在Java 8之前,要解决这个问题,则需要使用foreach循环遍历task集合:但是在Java 8中可 ...
- 11.享元模式(Flyweight Pattern)
面向对象的代价 面向对象很好地解决了系统抽象性的问题,同时在大多数情况下,也不会损及系统的性能.但是,在某些特殊的应用中下,由于对象的数量太大,采用面向对象会给系统带来难以承受的内存开销.比如: ...
- 编写高质量Python代码总结:待完成
1:字符串格式化 #避免%过多影响阅读 print('hello %(name)s'%{'name':'tom'}) #format方法print('{name} is very {emmition} ...
- golang channle 管道
管道的使用介绍 现在要计算 1-N 的各个数的阶乘,并且把各个数的阶乘放入到 map 中.最后显示出来.要求使用 goroutine 完成 package main import ( "fm ...
- 【转载】C++ getline函数用法
https://www.cnblogs.com/xiaofeiIDO/p/8574042.html 摘要: 通过getline()函数一个小小的实例,那么把getline()函数作为while的判断语 ...
- 我手机上常用的app和常访问的网站
====常用======Opera Mini browser 浏览器(版本26.0.2254.117241以上) 老版本7.7最最经典, 但该版本在新的安卓手机上总有部分区域显示空白. 现在的 Ope ...
- Nginx 配置反向代理后,页面中取绝对URL地址的问题显示代理端口
本文有V型知识库提供 upstream tomcat { server 127.0.0.1:82;} location / { proxy_pass http://tomcat;} 如上 ...
- ****** 四十 ******、软设笔记【网络基础】-Internet和Intranet基础
Internet和Intranet基础 一.网络地址及子网掩码 1.IP地址结构及类别 IP地址是由32位二进制数,即4个字节组成的,由网络号和主机号两个字段组成. 网络号的位数决定了可以分配的网络数 ...
- jqGrid api 中文说明
JQGrid是一个在jquery基础上做的一个表格控件,以ajax的方式和服务器端通信. JQGrid Demo 是一个在线的演示项目.在这里,可以知道jqgrid可以做什么事情. 下面是转自其他人b ...
- luogu 1268 树的重量
打眼一看就是最小生成树嘛,但经过板子wa掉的经历后得知,,emmmm,原来是, 构造! (虽然不知是什么但觉得听起来很厉害的样子...手动微笑) n=2的情况 自然就是g(1,2) n=3的情况,由于 ...