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:可持久化并查集

最新文章

  1. Linux-002-执行命令时,提示: -bash:&#160;{命令}:&#160;command&#160;not&#160;found
  2. WordPress 4.0 “Benny” 正式发布
  3. 解高次同余方程 (A^x=B(mod C),0&lt;=x&lt;C)Baby Step Giant Step算法
  4. hibernate和mybatis
  5. 第二节:Maven的运行机制
  6. Linux中 pid_t 类型的定义.
  7. MyEclipse 点击 部署 按钮 无效的解决办法
  8. SVN搭建本地版本控制仓库
  9. C#读写word
  10. DataTable.DataRow的复制
  11. 跟踪调试JDK源码时遇到的问题及解决方法
  12. GC调优在Spark应用中的实践(转载)
  13. 码农眼中的数学之~矩阵专栏(附Numpy讲解)
  14. 玩具装箱&amp;土地购买
  15. priority todo
  16. easyui中datagrid常见功能
  17. 阿里巴巴开源项目: canal
  18. cxf 动态调用.
  19. xpath教程 3 - xpath的小结
  20. unicode编码转汉字

热门文章

  1. 《精通并发与Netty》学习笔记(04 - Google Protobuf介绍)
  2. eclipse 如何从Gitee.com克隆工程到本地,并运行
  3. idea spring+springmvc+mybatis环境配置整合详解
  4. PYTHON 100days学习笔记001:初识python
  5. redis5.0 数据结构与命令
  6. 这可能是最简单易懂的 ZooKeeper 笔记
  7. Linux系列(2):入门之线上求助
  8. P1373 小a和uim之大逃离(DP)
  9. linux内核钩子--khook
  10. 解决github pages和github .md文件图片不显示