HDU 6188 Duizi and Shunzi

链接:http://acm.hdu.edu.cn/showproblem.php?pid=6188

思路:

签到题,以前写的。

实现代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<stack>
#include<map>
#include<vector>
#include<set>
using namespace std;
const int MAX=1e5+;
int main()
{
int n,m,a[MAX],p,ans,k;
while(scanf("%d",&n)!=EOF)
{
ans=;
for(int i = ;i <= n;i ++)
a[i]=;
for(int i = ;i <= n;i ++)
cin>>p,a[p]++;
for(int i = ;i <= n;i ++)
{
if(a[i]>=)
{
ans+=a[i]/;
a[i]%=;
}
if(i<=n-&&a[i]&&a[i+]%&&a[i+])
a[i]--,a[i+]--,a[i+]--,ans+=;
}
cout<<ans<<endl;
}
}

HDU 6182  A Math Problem

链接:http://acm.hdu.edu.cn/showproblem.php?pid=6182

思路: 签到

实现代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll M = 1e18+;
ll a[];
int main()
{
ll k = ;
ll n,m;
for(ll i = ;i<=;i++){
ll ans = ;
for(ll j=;j<=i;j++){
ans*=i;
}
//cout<<ans<<endl;
if(ans<=M)
a[k++] = ans;
else
break;
}
while(scanf("%lld",&n)!=EOF){
if(n>)
cout<<<<endl;
else{
for(ll i=;i<k;i++){
if(a[i]>n){
cout<<i<<endl;break;
}
else if(a[i]==n){
cout<<i+<<endl;break;
}
}
}
}
return ;
}

HDU 6186 CS Course

链接: http://acm.hdu.edu.cn/showproblem.php?pid=6186

思路:签到题

实现代码:

#include<bits/stdc++.h>
using namespace std;
const int M = ;
#define ll long long
ll a[M],or1[M],or2[M],and2[M],and1[M],xor1[M],xor2[M];
int main()
{
ll n,q,i,x;
while(scanf("%lld%lld",&n,&q)!=EOF){
for(i=;i<=n;i++){
scanf("%lld",&a[i]);
}
or1[] = a[];and1[] = a[]; xor1[] = a[];
for(i=;i<=n;i++){
or1[i] = (or1[i-]|a[i]);
and1[i] = (a[i]&and1[i-]);
xor1[i] = (xor1[i-]^a[i]);
}
or2[n] = a[n]; and2[n] = a[n];xor2[n] = a[n];
for(i=n-;i>=;i--){
or2[i] = (a[i]|or2[i+]);
and2[i] = (a[i]&and2[i+]);
xor2[i] = (a[i]^xor2[i+]);
}
//cout<<and1[2]<<" "<<(a[1]&a[2])<<endl;
ll y;
for(i=;i<q;i++){
scanf("%lld",&y);
if(y==)
printf("%lld %lld %lld\n",and2[],or2[],xor2[]);
else{
if(y==n)
printf("%lld %lld %lld\n",and1[n-],or1[n-],xor1[n-]);
else
printf("%lld %lld %lld\n",(and1[y-]&and2[y+]),(or1[y-]|or2[y+]),(xor1[y-]^xor2[y+]));
}
}
}
return ;
}

HDU 6183 Color it

链接: http://acm.hdu.edu.cn/showproblem.php?pid=6183

思路:线段树+动态开点

有50种颜色,对每一种颜色建一颗线段树维护,动态开点。
第一种操作:使点(x,y)的颜色变为c
第二种:询问(1,y1),(x,y2)两点间的颜色种类数量
我们可以以y轴建线段树,横坐标为值,那么要确定两点之前是否存在某种颜色,只要询问下每个颜色在y1,y2之间最小的值(也就是横坐标).判断下最小值是否小于第二种操作给出的x,如果小于的话就代表两点间存在这种颜色。 突然发现这道题以前也写过。。。。 实现代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mid int m = (l + r) >> 1
const int M = 1e6+;
int n = 1e6,flag=;
int sum[M],ne=,ls[M],rs[M],rt[]; void update(int &k,int l,int r,int p,int num){
if(!k){ //如果当前区间未拓展,拓展并赋值
k = ++ne;
sum[k] = num;
}
sum[k] = min(sum[k],num);//当前区间有值,更新下最小值
if(l == r)
return ;
mid;
if(p <= m) update(ls[k],l,m,p,num);
else update(rs[k],m+,r,p,num);
} void query(int k,int L,int R,int l,int r,int up){
if(!k||flag) return ;
if(L <= l&&R >= r){
if(sum[k]<=up)
flag = ;
return;
}
mid;
if(L <= m) query(ls[k],L,R,l,m,up);
if(R > m) query(rs[k],L,R,m+,r,up);
return ;
} void init(){
memset(rt,,sizeof(rt));
memset(sum,,sizeof(sum));
memset(ls,,sizeof(ls));
memset(rs,,sizeof(rs));
ne = ;
}
int main()
{
int op,x,y,z;
while(~scanf("%d",&op)){
if(op == )
init();
else if(op == ){
scanf("%d%d%d",&x,&y,&z);
update(rt[z],,n,y,x);
}
else if(op == ){
scanf("%d%d%d",&x,&y,&z);
int ans = ;
for(int i = ;i <= ;i ++){
flag = ;
query(rt[i],y,z,,n,x);
if(flag) ans++;
}
printf("%d\n",ans);
}
else return ;
}
return ;
}

HDU 6191 Query on A Tree

链接: http://acm.hdu.edu.cn/showproblem.php?pid=6191

思路:dfs序 + 可持久化Trie树

用dfs序把树转换成序列,由于dfs序的特性,子树在序列中是连续的一段区间,那么对这段区间我们可以用可持久化trie来查询与x异或最大的值。

实现代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int M = 1e5+;
int a[M];
int rt[M],tot,tree[M<<][],son[M<<][],idx,in[M],out[M],cnt,head[M];
vector<int>g[M];
template <class T>
void read(T &x){
char c;
bool op = ;
while(c = getchar(), c < '' || c > '')
if(c == '-') op = ;
x = c - '';
while(c = getchar(), c >= '' && c <= '')
x = x * + c - '';
if(op) x = -x;
}
template <class T>
void write(T x){
if(x < ) putchar('-'), x = -x;
if(x >= ) write(x / );
putchar('' + x % );
} void Insert(int old,int now,int x,int pos){
if(pos < ) return;
int tmp = (x&(<<pos))>;
tree[now][tmp] = tree[old][tmp] + ;
tree[now][tmp^] = tree[old][tmp^];
son[now][tmp^] = son[old][tmp^];
Insert(son[old][tmp],son[now][tmp]=++idx,x,pos-);
} void dfs(int u){
in[u] = ++tot;
Insert(rt[in[u]-],rt[in[u]]=++idx,a[u],);
for(int i = ;i < g[u].size();i ++){
dfs(g[u][i]);
}
out[u] = tot;
} int query(int old,int now,int x,int ans,int pos){
if(pos < ) return ans;
int tmp=!!(x&(<<pos));
if(tree[now][tmp^]>tree[old][tmp^])
return query(son[old][tmp^],son[now][tmp^],x,ans|(<<pos),pos-);
else
return query(son[old][tmp],son[now][tmp],x,ans,pos-);
}
int init(){
memset(rt,,sizeof(rt));
memset(son,,sizeof(son));
memset(tree,,sizeof(tree));
idx = ,tot = ;
}
int main(){
int n,q,x,z,y;
while(scanf("%d%d",&n,&q)!=EOF){
init();
for(int i = ;i <= n;i ++){
read(a[i]);
}
for(int i = ;i <= n;i ++){
read(z);
g[z].push_back(i);
}
dfs();
while(q--){
read(x),read(y);
write(query(rt[in[x]-],rt[out[x]],y,,));
putchar('\n');
}
for(int i = ;i <= n;i ++)
g[i].clear();
}
return ;
}

2017ACM/ICPC广西邀请赛-重现赛的更多相关文章

  1. 2017ACM/ICPC广西邀请赛-重现赛 1007.Duizi and Shunzi

    Problem Description Nike likes playing cards and makes a problem of it. Now give you n integers, ai( ...

  2. 2017ACM/ICPC广西邀请赛-重现赛 1010.Query on A Tree

    Problem Description Monkey A lives on a tree, he always plays on this tree. One day, monkey A learne ...

  3. 2017ACM/ICPC广西邀请赛-重现赛 1004.Covering

    Problem Description Bob's school has a big playground, boys and girls always play games here after s ...

  4. 2017ACM/ICPC广西邀请赛-重现赛 1001 A Math Problem

    2017-08-31 16:48:00 writer:pprp 这个题比较容易,我用的是快速幂 写了一次就过了 题目如下: A Math Problem Time Limit: 2000/1000 M ...

  5. 2017ACM/ICPC广西邀请赛-重现赛1005 CS course

    2017-08-31 16:19:30 writer:pprp 这道题快要卡死我了,队友已经告诉我思路了,但是做题速度很缓慢,很费力,想必是因为之前 的训练都是面向题解编程的缘故吧,以后不能这样了,另 ...

  6. 2017ACM/ICPC广西邀请赛-重现赛(感谢广西大学)

    上一场CF打到心态爆炸,这几天也没啥想干的 A Math Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/3 ...

  7. HDU 6191 2017ACM/ICPC广西邀请赛 J Query on A Tree 可持久化01字典树+dfs序

    题意 给一颗\(n\)个节点的带点权的树,以\(1\)为根节点,\(q\)次询问,每次询问给出2个数\(u\),\(x\),求\(u\)的子树中的点上的值与\(x\)异或的值最大为多少 分析 先dfs ...

  8. 2017ACM/ICPC广西邀请赛

    A.A Math Problem #include <bits/stdc++.h> using namespace std; typedef long long ll; inline ll ...

  9. 2017ACM/ICPC广西邀请赛 Duizi and Shunzi

    题意:就是一个集合分开,有两种区分 对子:两个相同数字,顺子:连续三个不同数字,问最多分多少个 解法:贪心,如果当前数字不构成顺子就取对子 /2,如果可以取顺子,那么先取顺子再取对子 #include ...

随机推荐

  1. Skyline从5.1升级版本到6.5的常见接口变化问题

    1.原来Route对象升级成Presentation对象后,激活方法的变化: 原来5.1版本示例代码: function flyto(thisa) { var thisid = thisa.id; v ...

  2. PHP实现栈数据结构

    利用php面向对象思想,栈的属性有top.最大存储数.和存储容器(这里利用了php数组). 代码如下:实现了入栈.出栈.遍历栈的几个方法: <?php class Stack{ const MA ...

  3. LED恒流驱动IC汇总

    LED恒流驱动IC汇总 2017年09月22日 11:29:01 阅读数:569 这几天在找LED恒流驱动芯片,无意间在LED网论坛上发现这个帖子,分享给大家! LED恒流IC芯片大盘点        ...

  4. 51Nod 1705 七星剑

    一道很新颖的概率DP,我看数据范围还以为是有指数级别的复杂度的呢 记得有人说期望要倒着推,但放在这道题上,就咕咕了吧. 我们考虑正着概率DP,设\(fi\)表示将剑升到\(i\)颗星花费的期望,这样我 ...

  5. [Oracle]如何取Control File 的Dump

    ]如何取Control File 的Dump: SQL> alter session set events 'immediate trace name controlf level 3';SQL ...

  6. WPF 录屏软件研发心得及思路分享(已结束开发)

    最近由于工程需要开始研发基于Windows的自动录屏软件,很多细节很多功能需要处理,毕竟一个完美的录屏软件不是你随随便便就可以写出来的.首先参考了大部分的录屏软件,在研发的过程中遇到了很多的问题:比如 ...

  7. Visual Studio 2019 Serial Keys

    Visual Studio 2019 Enterprise BF8Y8-GN2QH-T84XB-QVY3B-RC4DF Visual Studio 2019 Professional NYWVH-HT ...

  8. 20min 快速着手Markdown

    目录 Markdown介绍和基本使用 初步介绍 markdown的使用场景 为什么是 Markdown markdown的基本语法和使用平台 Q&A: Markdown介绍和基本使用 初步介绍 ...

  9. Unity 敌人波次设计

    一.平均时间随机敌人 将所有种类敌人预制物体放在一个列表里面,每隔时间T从列表中随机选出一个生成在场景中. 二.时间加权紧迫度随机敌人 在随机情况下每种敌人出现的概率近似相等,当敌人种类较多时,有可能 ...

  10. 回顾:前端模块化和AMD、CMD规范(全)

    先列举下一些著名言论: "我想定义一个 each 方法遍历对象,但页头的 util.js 里已经定义了一个,我的只能叫 eachObject 了,好无奈." "Requi ...