Summer training #9
A:树形DP
给出一棵树,但是它的边是有向边,选择一个城市,问最少调整多少条边的方向能使一个选中城市可以到达所有的点,输出最小的调整的边数,和对应的点
要改变的边的权值为1,不需要改变的边的权值为0,
两次dfs 第一次算出以1点为根节点到所有点要改变的边数,第二次以1为根节点向下遍历节点 算出每一个点到达所有点要改变的边数,
dp[son]+=(dp[root]-dp[son])+((tree[i].val)?-1:1),某一点的值是他父节点的值减去他以前的值再考虑他与父节点之间的边的方向。
#include<iostream>
#include<string>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<vector>
#include<iomanip>
#include<queue>
#include<stack>
using namespace std;
int n,lne;
int dp[];
int head[];
int city[];
struct node
{
int to,next,val;
}tree[];
void add(int a,int b)
{
tree[lne].to=b;
tree[lne].val=;
tree[lne].next=head[a];
head[a]=lne++;
tree[lne].to=a;
tree[lne].val=;
tree[lne].next=head[b];
head[b]=lne++;
}
void dfs1(int root,int pre)
{
for(int i=head[root];i!=-;i=tree[i].next)
{
int son=tree[i].to;
if(son==pre)
continue;
dfs1(son,root);
dp[root]+=dp[son]+tree[i].val;
}
}
void dfs2(int root,int pre)
{
for(int i=head[root];i!=-;i=tree[i].next)
{
int son=tree[i].to;
if(son==pre)
continue;
dp[son]+=(dp[root]-dp[son])+((tree[i].val)?-:);
dfs2(son,root);
}
}
int main()
{
int a,b;
while(scanf("%d",&n)!=EOF)
{
lne=;
memset(head,-,sizeof(head));
for(int i=;i<n-;i++)
{
scanf("%d%d",&a,&b);
add(a,b);
}
int k=,sum=;
memset(dp,,sizeof(dp));
dfs1(,);
dfs2(,);
for(int i=;i<=n;i++)
{
if(dp[i]<sum)
{
memset(city,,sizeof(city));
k=;
city[k++]=i;
sum=dp[i];
}
else if(dp[i]==sum)
city[k++]=i;
}
printf("%d\n",sum);
for(int i=;i<k;i++)
{
if(i==k-)
printf("%d\n",city[i]);
else printf("%d ",city[i]);
}
}
return ;
}
B:算表面积 先把每个除了四周都加起来 然后减去四周重复的
#include <bits/stdc++.h>
#include <cstring>
#include <iostream>
#include <algorithm>
#define foror(i,a,b) for(i=a;i<b;i++)
#define foror2(i,a,b) for(i=a;i>b;i--)
#define EPS 1.0e-6
#define PI acos(-1.0)
#define INF 3000000000
#define MOD 1000000009
#define mem(a,b) memset((a),b,sizeof(a))
#define TS printf("!!!\n")
#define lson o<<1, l, m
#define rson o<<1|1, m+1, r
//using ll = long long;
//using ull= unsigned long long;
//std::ios::sync_with_stdio(false);
using namespace std;
//priority_queue<int,vector<int>,greater<int>> que;
typedef long long ll;
int a[][];
char s[][];
int dir[][];
int main()
{
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
dir[][]=-,dir[][]=;
dir[][]=,dir[][]=;
dir[][]=,dir[][]=;
dir[][]=,dir[][]=-;
int n,m ;
cin >> n >> m;
mem(a,);
for(int i=;i<=n;i++)
{
scanf("%s",s[i]+);
for(int j=;j<=m;j++)
a[i][j]=s[i][j]-'';
}
int ans=;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
ans+=a[i][j]*+;
if(a[i][j]==)
ans-=;
}
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
for(int w=;w<;w++)
{
int dx=i+dir[w][];
int dy=j+dir[w][];
ans-=min(a[i][j],a[dx][dy]);
}
}
cout<<ans<<endl;
return ;
}
C:DFS+二进制压缩
#include <bits/stdc++.h>
#include <cstring>
#include <iostream>
#include <algorithm>
#define foror(i,a,b) for(i=a;i<b;i++)
#define foror2(i,a,b) for(i=a;i>b;i--)
#define EPS 1.0e-6
#define PI acos(-1.0)
#define INF 3000000000
#define MOD 1000000009
#define mem(a,b) memset((a),b,sizeof(a))
#define TS printf("!!!\n")
#define lson o<<1, l, m
#define rson o<<1|1, m+1, r
//using ll = long long;
//using ull= unsigned long long;
//std::ios::sync_with_stdio(false);
using namespace std;
//priority_queue<int,vector<int>,greater<int>> que;
typedef long long ll;
int ans;
char s[][];
int dir[][];
int bit[];
int n,m;
int cal(int n)
{
int ans= ;
for (ans=;n;ans++)
{
n&=(n-);
}
return ans;
}
void dfs(int row,int pass,int now)
{
if(row==n)
{
int cur=max(pass,cal(now));
ans=min(ans,cur);
return ;
}
dfs(row+,pass+,now);
dfs(row+,pass,now|bit[row]);
}
int main()
{
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
dir[][]=-,dir[][]=;
dir[][]=,dir[][]=;
dir[][]=,dir[][]=;
dir[][]=,dir[][]=-;
cin >> n >> m;
ans=min(n,m);
for(int i=;i<n;i++)
{
scanf("%s",s[i]);
for(int j=;j<m;j++)
if(s[i][j]=='*')
bit[i]|=(<<j);
}
dfs(,,);
cout<<ans<<endl;
return ;
}
D:BFS+SG函数 :如果一个点是必胜点 那么他后面和前面的点一定不是必胜点 反之一个点不是必胜点 那么他前面和后面的点的后继如果有必胜点 则他不是必胜点 如果没有 则他是必胜点
while(set.find(x)!=set.end()) x++ 当set为空时 返回1 当set为0-y连续的时 返回的是y+1 当0-y有缺少时 返回的是第一个缺少的数
#include <bits/stdc++.h>
#include <cstring>
#include <iostream>
#include <algorithm>
#define foror(i,a,b) for(i=a;i<b;i++)
#define foror2(i,a,b) for(i=a;i>b;i--)
#define EPS 1.0e-6
#define PI acos(-1.0)
#define INF 3000000000
#define MOD 1000000009
#define mem(a,b) memset((a),b,sizeof(a))
#define TS printf("!!!\n")
#define lson o<<1, l, m
#define rson o<<1|1, m+1, r
//using ll = long long;
//using ull= unsigned long long;
//std::ios::sync_with_stdio(false);
using namespace std;
//priority_queue<int,vector<int>,greater<int>> que;
typedef long long ll;
vector<int> tree[];
//vector<int> newtree[1005];
int visit[];
int n,m;
int sg[];
queue<int> que;
void bfs()
{
visit[]=;
while(!que.empty())
{
int cur=que.front();
que.pop();
for(int i=;i<tree[cur].size();i++)
{
if(visit[tree[cur][i]]==)
{
visit[tree[cur][i]]=visit[cur]+;
que.push(tree[cur][i]);
}
}
}
}
/*void rebuild()
{
for(int i=1;i<=n;i++)
{
for(int j=0;j<tree[i].size();i++)
{
if(visit[tree[i][j]]>visit[i])
newtree[i].push_back(tree[i][j]);
}
}
}*/
int sgdfs(int x)
{
if(sg[x]!=-)
return sg[x];
int zero=;
//one=-1;
set<int> a;
for(int i=;i<tree[x].size();i++)
{
if(visit[tree[x][i]]>visit[x])
a.insert(sgdfs(tree[x][i]));
}
while(a.find(zero)!=a.end())
zero++;
sg[x]=zero;
return sg[x];
}
int main()
{
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
mem(sg,-);
mem(visit,);
cin >> n >> m;
int s,f;
for(int i=;i<=m;i++)
{
scanf("%d %d",&s,&f);
tree[s].push_back(f);
tree[f].push_back(s);
}
que.push();
bfs();
//rebuild();
int ans=sgdfs();
if(ans)
cout<<"Vladimir";
else
cout<<"Nikolay";
//for(int i=1;i<=n;i++)
//ans=max(ans,visit[i]);
return ;
}
F:浮标
因为间距的单调不会使得答案单调,间距过大过小都会使得最后的移动距离不是最优,所以是使用三分而不是二分
对于每次三分,每次在n个点里面假设一个点不动,然后枚举完算一遍,取最优。
while(fabs(r - l) > eps) {
double mid = (l + r) / 2.0;
double midd = (mid + r) / 2.0;
if(cal(mid, ) > cal(midd, )) l = mid;
else r = midd;
}
double ans = cal(l, ) > cal(r, ) ? r : l;
三分
#include <bits/stdc++.h>
using namespace std;
#define N 405
const double eps = 1e-;
double num[N];
int n, id; double cal(double x, int flag) {
double res = , ans = ;
for(int st = ; st <= n; st++) {
res = ;
for(int i = ; i < st; i++)
res += fabs(num[st] - (st - i) * x - num[i]);
for(int i = st + ; i <= n; i++)
res += fabs(num[st] + (i - st) * x - num[i]);
if(ans > res) ans = res, id = st;
}
return ans;
} void solve() {
scanf("%d", &n);
for(int i = ; i <= n; i++) scanf("%lf", &num[i]);
double l = , r = ;
while(fabs(r - l) > eps) {
double mid = (l + r) / 2.0;
double midd = (mid + r) / 2.0;
if(cal(mid, ) > cal(midd, )) l = mid;
else r = midd;
}
double ans = cal(l, ) > cal(r, ) ? r : l;
double res = cal(ans, );
printf("%.4f\n", res);
for(int i = ; i < id; i++)
printf("%.10f ", num[id] - (id - i) * ans);
printf("%.10f ", num[id]);
for(int i = id + ; i <= n; i++)
printf("%.10f ", num[id] + (i - id) * ans);
} int main() {
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
solve();
return ;
}
G:在线-->可持久化线段树(主席树 离线-->权值线段树
#include<bits/stdc++.h>
using namespace std;
const int maxn=;
struct {
int l,r,loca;
}tr[maxn*];
int tot,A[maxn],rt[maxn];
void pushup(int x){
tr[x].loca=min(tr[tr[x].l].loca,tr[tr[x].r].loca);
}
void insert(int &x,int l,int r,int a,int b){
tr[++tot]=tr[x];
x=tot;
if(l==r){
tr[x].loca=b;
return ;
}
int mid=(l+r)>>;
if(a<=mid)
insert(tr[x].l,l,mid,a,b);
else
insert(tr[x].r,mid+,r,a,b);
pushup(x);
}
int query(int x,int l,int r,int a){
if(l==r)return l;
int mid=(l+r)/;
if(tr[tr[x].l].loca<a)
return query(tr[x].l,l,mid,a);
else
return query(tr[x].r,mid+,r,a);
}
int main(){
int n,m;
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d",&A[i]);
insert(rt[i]=rt[i-],,,A[i],i);
}
scanf("%d",&m);
while(m--){
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",query(rt[b],,,a));
}
}
I:莫队
K:可持久化并查集
Summer training #9的更多相关文章
- hdu 4946 2014 Multi-University Training Contest 8
Area of Mushroom Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- 2016 Multi-University Training Contests
2016 Multi-University Training Contest 1 2016 Multi-University Training Contest 2 2016 Multi-Univers ...
- 2016 Multi-University Training Contest 2 D. Differencia
Differencia Time Limit: 10000/10000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tot ...
- 2016 Multi-University Training Contest 1 G. Rigid Frameworks
Rigid Frameworks Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- ACM: Gym 101047K Training with Phuket's larvae - 思维题
Gym 101047K Training with Phuket's larvae Time Limit:2000MS Memory Limit:65536KB 64bit IO F ...
- The Solution of UESTC 2016 Summer Training #1 Div.2 Problem C
Link http://acm.hust.edu.cn/vjudge/contest/121539#problem/C Description standard input/output After ...
- 2012 Multi-University Training Contest 9 / hdu4389
2012 Multi-University Training Contest 9 / hdu4389 打巨表,实为数位dp 还不太懂 先这样放着.. 对于打表,当然我们不能直接打,这里有技巧.我们可以 ...
- 2014 Multi-University Training Contest 9#11
2014 Multi-University Training Contest 9#11 Killing MonstersTime Limit: 2000/1000 MS (Java/Others) ...
- 2014 Multi-University Training Contest 9#6
2014 Multi-University Training Contest 9#6 Fast Matrix CalculationTime Limit: 2000/1000 MS (Java/Oth ...
- 2016 Multi-University Training Contest 1
8/11 2016 Multi-University Training Contest 1 官方题解 老年选手历险记 最小生成树+线性期望 A Abandoned country(BH) 题意: 1. ...
随机推荐
- Django-Form组件-formset_factory
Formset 多个表单的集合,可以同时提交多个from表单中的数据,在web页面中,可以在同一个页面,提交多个form表单. Django针对不同的formset提供了3种方法: formset_f ...
- 如何查看linux系统安装时间
第一种方法: 先查看系统盘挂到哪个分区上,然后用 dumpe2fs 查看这个磁盘分区 创建的时间,即可查出此 服务器 系统安装的时间.() # dumpe2fs /dev/sda3|grep -i ...
- 安装cinder
在控制节点上安装 备注:安装cinder时,nova-compute创建虚拟机时会默认使用cinder指定的存储方式,所以,如果你还要使用本地存储的话,请先参考我这边文章进行设置: 配置nova-co ...
- USACO4.4 Shuttle Puzzle【bfs+优化】
直接上$bfs$,每一个状态记录下当前字符串的样子,空格的位置,和走到这个状态的答案. 用空格的位置转移,只有$50pts$ 考虑到题目一个性质:$W$只往右走,$B$只往左走,就可以过了. #inc ...
- 【JAVA开发】eclipse最新版本Eclipse Neon
这个版本的IDE支持Java.JavaScript.C/C++.PHP和Fortran等多种编程语言: 这个版本首次鼓励用户使用Eclipse Installer来做安装,这是一种由Eclipse O ...
- 【并行计算-CUDA开发】CUDA存储器模型
CUDA存储器模型 除了执行模型以外,CUDA也规定了存储器模型(如图2所示)和一系列用于主控CPU与GPU间通信的不同地址空间.图中红色的区域表示GPU片内的高速存储器,橙色区域表示DRAM中的的地 ...
- Cpython全局解释器锁原理剖析
"""In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple ...
- RestTemplateBuilder类
Spring Boot使用RestTemplate消费REST服务的几个问题记录 我们可以通过Spring Boot快速开发REST接口,同时也可能需要在实现接口的过程中,通过Spring Boot调 ...
- Ubuntu下安装Golong并用Vscode做IDE最有效方法,避免99%的坑 | 轻松学习GO
最详细的教程,避开99%的坑,亲测有效 由于大部分教程都是win版本的,所以专门总结了一个linux版本的,其核心在于环境配置和插件安装,经历本人通宵7小时解决了这个问题,用自己的踩坑帮助大家避坑,希 ...
- oracle按用户导出导入表
查看备份目录:select * from dba_directories where directory_name='DATA_PUMP_DIR'; 导入导出的文件名默认都是以备份目录为相对路径. 按 ...