软件a排斥b,当安装b以后则提示卸载b后a才能运作,如何使两个手机软件2007兼容包可以卸载吗运作?

bzoj4196【NOI2015】软件包管理器 - 编程语言 - 阿里欧歌
4196: [Noi2015]软件包管理器
Time Limit:&10 Sec&&Memory Limit:&512 MB Submit:&588&&Solved:&336 [][][]
Description
现在你要为你的软件包管理器写一个依赖解决程序。根据反馈,用户希望在安装和卸载某个软件包时,快速地知道这个操作实际上会改变多少个软件包的安装状态(即安装操作会安装多少个未安装的软件包,或卸载操作会卸载多少个已安装的软件包),你的任务就是实现这个部分。注意,安装一个已安装的软件包,或卸载一个未安装的软件包,都不会改变任何软件包的安装状态,即在此情况下,改变安装状态的软件包数为0。
接下来一行包含1个正整数q,表示询问的总数。
之后q行,每行1个询问。询问分为两种:
installx:表示安装软件包x
uninstallx:表示卸载软件包x
你需要维护每个软件包的安装状态,一开始所有的软件包都处于未安装状态。对于每个操作,你需要输出这步操作会改变多少个软件包的安装状态,随后应用这个操作(即改变你维护的安装状态)。
Sample Input
Sample Output
之后安装 6 号软件包,只需要安装 6 号软件包。此时安装了 0,1,5,6 四个软件包。
卸载 1 号软件包需要卸载 1,5,6 三个软件包。此时只有 0 号软件包还处于安装状态。
之后安装 4 号软件包,需要安装 1,4 两个软件包。此时 0,1,4 处在安装状态。
最后,卸载 0 号软件包会卸载所有的软件包。
#include&iostream& #include&cstdio& #include&cstdlib& #include&cmath& #include&cstring& #include&algorithm& #define F(i,j,n) for(int i=j;i&=n;i++) #define D(i,j,n) for(int i=j;i&=n;i--) #define ll long long #define maxn 100005 struct edge{int next,}e[maxn]; struct seg{int l,r,sum,}t[maxn*4]; int n,m,x,cnt, int d[maxn],l[maxn],r[maxn],sz[maxn],fa[maxn],son[maxn]; int head[maxn],belong[maxn]; char ch[20]; inline int read() {
int x=0,f=1;char ch=getchar();
while (ch&'0'||ch&'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch&='0'&&ch&='9'){x=x*10+ch-'0';ch=getchar();}
return x*f; } inline void add_edge(int x,int y) {
e[++cnt]=(edge){head[x],y};head[x]= } inline void dfs1(int x) {
for(int i=head[x];i;i=e[i].next)
int y=e[i].
d[y]=d[x]+1;
sz[x]+=sz[y];
if (sz[y]&sz[son[x]]) son[x]=y;
} } inline void dfs2(int x,int chain) {
belong[x]=l[x]=++
if (son[x]) dfs2(son[x],chain);
for(int i=head[x];i;i=e[i].next)
if (e[i].to!=son[x]) dfs2(e[i].to,e[i].to);
r[x]= } inline void update(int k,int z) {
t[k].sum=z*(t[k].r-t[k].l+1);
t[k].tag=z; } inline void pushdown(int k) {
if (t[k].tag==-1)
update(k&&1,t[k].tag);update(k&&1|1,t[k].tag);
t[k].tag=-1; } inline void pushup(int k) {
t[k].sum=t[k&&1].sum+t[k&&1|1]. } inline void build(int k,int l,int r) {
t[k].l=l;t[k].r=r;t[k].tag=-1;
int mid=(l+r)&&1;
build(k&&1,l,mid);build(k&&1|1,mid+1,r); } inline void change(int k,int x,int y,int z) {
if (t[k].l==x&&t[k].r==y){update(k,z);}
int mid=(t[k].l+t[k].r)&&1;
pushdown(k);
if (y&=mid) change(k&&1,x,y,z);
else if (x&mid) change(k&&1|1,x,y,z);
else change(k&&1,x,mid,z),change(k&&1|1,mid+1,y,z);
pushup(k); } inline int query(int k,int x,int y) {
if (t[k].l==x&&t[k].r==y) return t[k].
int mid=(t[k].l+t[k].r)&&1;
pushdown(k);
if (y&=mid) return query(k&&1,x,y);
else if (x&mid) return query(k&&1|1,x,y);
else return query(k&&1,x,mid)+query(k&&1|1,mid+1,y); } inline int solvesum(int x) {
int sum=0;
while (belong[x]!=1)
sum+=query(1,l[belong[x]],l[x]);
x=fa[belong[x]];
sum+=query(1,1,l[x]); } inline void solvechange(int x,int z) {
while (belong[x]!=1)
change(1,l[belong[x]],l[x],z);
x=fa[belong[x]];
change(1,1,l[x],z); } int main() {
F(i,2,n) add_edge(read()+1,i);
d[1]=1;dfs1(1);dfs2(1,1);
build(1,1,n);
scanf(&%s&,ch);x=read()+1;
if (ch[0]=='i')
printf(&%d/n&,d[x]-solvesum(x));
solvechange(x,1);
printf(&%d/n&,query(1,l[x],r[x]));
change(1,l[x],r[x],0);
作者:AaronGZK 发表于 12:09:28
阅读:11 评论:0我去.什么意思啊.这什么东西.卸载了A又换一个自动安装B,卸载了B,B又安装了A.求高手解决!_百度知道
我去.什么意思啊.这什么东西.卸载了A又换一个自动安装B,卸载了B,B又安装了A.求高手解决!
这神坑,求高手. 软件A叫今日黄历..软件B叫生活E时代.
求解决! 求高手~!
360不行.控制面板憨哗封狙莩缴凤斜脯铆也不行. 都是一个效果,360卸载一直卡着哪.
求高手解决!
提问者采纳
很明显中毒了。可以重装系统了。
你不要骗我,我不信!!!
小孩子没见过世面
提问者评价
谢谢.重装了. 外加我不是小孩.电脑有很多不懂
来自团队:
其他类似问题
为您推荐:
其他1条回答
手动删除,直接del
一样啊. 删了A 电脑就卡下,然后B就出来了
你截个图看下
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁您的举报已经提交成功,我们将尽快处理,谢谢!
你好 是内存卡的问题 可以换一张的
这个可以去售后刷机啊
大家还关注
(window.slotbydup=window.slotbydup || []).push({
id: '2081942',
container: s,
size: '1000,60',
display: 'inlay-fix'

我要回帖

更多关于 卸载2007兼容包 的文章

 

随机推荐