hdu3074(Multiply game)

2024-06-10 21:38
文章标签 game multiply hdu3074

本文主要是介绍hdu3074(Multiply game),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

纯模板,就是把单点更新,区间求和改为单点更新,区间求积。

题意:给出n个数,有m个操作,操作有:询问区间[L,R]中所有数的成绩、改变某一个数的值。
思路:线段树模版题。在每个结点设一个值保存乘积。
 
第二次做的时候错在了——int64位上;
由于成绩的结果较大要用--int64;所以有关输出的量都要用int64,其中包括find函数;结构中sum的定义,等;

 

 

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 60000
#define M 1000000007
struct point
{
 int x,y;
 __int64 sum;
}a[N*3];
void tree(int t,int x,int y)
{
 a[t].x=x;
 a[t].y=y;
 a[t].sum=0;
 if(x==y)
  return ;
 int temp=2*t;
 int mid=(x+y)/2;
 tree(temp,x,mid);
 tree(temp+1,mid+1,y);
 return ;
}
void IN(int t,int x,int y)
{
 if(a[t].x==a[t].y)
 {
  a[t].sum=y;
  return ;
 }
 int temp=2*t;
 int mid=(a[t].x+a[t].y)/2;
 if(x<=mid)
  IN(temp,x,y);
 else
  IN(temp+1,x,y);
 a[t].sum=a[temp].sum*a[temp+1].sum%M;
 return ;
}
__int64 find(int t,int x,int y)
{
 __int64 sum=1;
 if(a[t].x==x&&a[t].y==y)
  return a[t].sum;
 int temp=2*t;
 int mid=(a[t].x+a[t].y)/2;
 if(y<=mid)
  sum=sum*find(temp,x,y);
 else if(x>mid)
  sum=sum*find(temp+1,x,y);
 else
 {
  sum=sum*find(temp,x,mid)%M;
  sum=sum*find(temp+1,mid+1,y)%M;
 }
 return sum;
}
int main()
{
 int m,n,i,j,k,h;
 int a,b,c;
 scanf("%d",&k);
 while(k--)
 {
  scanf("%d",&n);
  tree(1,1,n);
  for(i=1;i<=n;i++)
  {
   scanf("%d",&m);
   IN(1,i,m);
  }
  scanf("%d",&h);
  while(h--)
  {
   scanf("%d%d%d",&a,&b,&c);
   if(a==0)
    printf("%I64d\n",find(1,b,c));
   else
    IN(1,b,c);
  }
 }
 return 0;
}

 

 

 

 

 

 

 

 

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 60000
#define M 1000000007
struct point
{
 int x,y;
 __int64 sum;
}a[N*3];
void tree(int t,int x,int y)
{
 a[t].x=x;
 a[t].y=y;
 a[t].sum=0;
 if(x==y)
  return ;
 int temp=2*t;
 int mid=(x+y)/2;
 tree(temp,x,mid);
 tree(temp+1,mid+1,y);
 return ;
}
void IN(int t,int x,int y)
{
 if(a[t].x==a[t].y)
 {
  a[t].sum=y;
  return ;
 }
 int temp=2*t;
 int mid=(a[t].x+a[t].y)/2;
 if(x<=mid)
  IN(temp,x,y);
 else
  IN(temp+1,x,y);
 a[t].sum=a[temp].sum*a[temp+1].sum%M;
 return ;
}
__int64 find(int t,int x,int y)
{
 __int64 sum=1;
 if(a[t].x==x&&a[t].y==y)
  return a[t].sum;
 int temp=2*t;
 int mid=(a[t].x+a[t].y)/2;
 if(y<=mid)
  return find(temp,x,y);
 else if(x>mid)
  return find(temp+1,x,y);
 else
 {
  return find(temp,x,mid)%M*find(temp+1,mid+1,y)%M;
 }
}
int main()
{
 int m,n,i,j,k,h;
 int a,b,c;
 scanf("%d",&k);
 while(k--)
 {
  scanf("%d",&n);
  tree(1,1,n);
  for(i=1;i<=n;i++)
  {
   scanf("%d",&m);
   IN(1,i,m);
  }
  scanf("%d",&h);
  while(h--)
  {
   scanf("%d%d%d",&a,&b,&c);
   if(a==0)
    printf("%I64d\n",find(1,b,c));
   else
    IN(1,b,c);
  }
 }
 return 0;
}

 

 

 

 

 

 

 

 

 

 

 

 

 

这篇关于hdu3074(Multiply game)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1049336

相关文章

fzu 2275 Game KMP

Problem 2275 Game Time Limit: 1000 mSec    Memory Limit : 262144 KB  Problem Description Alice and Bob is playing a game. Each of them has a number. Alice’s number is A, and Bob’s number i

10400 -Game Show Math

这道题的话利用了暴力深搜,尽管给了20S,但是这样还会超时,所以就需要利用回溯进行减枝,因为是DFS,所以用一个数组vis[i][j]记录是否在状态i时候取到过j值,如果取到过的话,那么直接回溯(往后搜索已经没有意义了,之前到达这个状态的时候是无法得到结果的) 还有需要注意的地方就是题目的要求,每一步的结构都在(-32000,32000)之间,所以需要一步判断,如果在这个范围外直接回溯 最后一

【POJ】1733 Parity game 并查集

传送门:【POJ】1733 Parity game 题目大意:给你一个长度为n的01序列,再给你m句话,每句话是一个区间【L,R】,告诉你区间【L,R】中1的个数,现在你的任务是找到从第几句话开始说的和前面矛盾,出现第一次假话的时候前面有多少是真话。 题目分析:一开始看几乎没思路啊。后来没办法了,只能跑别人的博客去看看了。。。一看到说把一个区间【L,R】拆成两个区间【0,L-1】,

【HDU】5426 Rikka with Game【DP】

题目链接:【HDU】5426 Rikka with Game #include <bits/stdc++.h>using namespace std ;typedef long long LL ;#define clr( a , x ) memset ( a , x , sizeof a )const int MAXN = 100005 ;const int MAXE = 200005 ;

LeetCode 45 Jump Game II

题意: 给出一个步长数组nums,如果一个人站在i这个点上那么他可以向右最多走nums[i]步,求从左端点走到右端点的最少步数。 思路: 如果点x可以用dp[x]步到达,那么[ x + 1, x + nums[x] ]区间内的点都可以用dp[x] + 1步到达。 利用这个想法,可以O(n)的求出走一步可以到达哪些位置,走两步可以到达哪些位置,以此类推。 代码: clas

【论文笔记】Multi-Task Learning as a Bargaining Game

Abstract 本文将多任务学习中的梯度组合步骤视为一种讨价还价式博弈(bargaining game),通过游戏,各个任务协商出共识梯度更新方向。 在一定条件下,这种问题具有唯一解(Nash Bargaining Solution),可以作为多任务学习中的一种原则方法。 本文提出Nash-MTL,推导了其收敛性的理论保证。 1 Introduction 大部分MTL优化算法遵循一个通用方

android-Intent,Injector,Template,Adapter,Validation,Gesture,Game,Game Engine,Bluetooth...

Intent Intent PhotoPicker 图片选择 & 图片预览https://github.com/donglua/PhotoPicker Injector AndroidAnnotations Fast Android Development. Easy maintainance. https://github.com/excilys/androidannotations

HDU5515 Game of Flying Circus(二分)

题意:题解有翻译,然后自己拦截对手时候可以任意走,当然是直线最快啦 题解:http://www.cnblogs.com/qscqesze/p/4931912.html #include<bits/stdc++.h>using namespace std;#define LL long long#define pb push_back#define X first#define Y

Plus and Multiply(1500)

Plus and Multiply 题面翻译 有一个无穷大的正整数集合 S S S,该集合按下面所述方法生成: 数字 1 1 1 在集合 S S S 中。 若数字 x x x 在该集合中,那么数 x × a x \times a x×a 和数 x + b x+b x+b 均在集合 S S S 中。(其中 a a a 与 b b b 为给定常数) 现在给出数 n ,

hdu 1846 Brave Game 巴什博奕

Description 十年前读大学的时候,中国每年都要从国外引进一些电影大片,其中有一部电影就叫《勇敢者的游戏》(英文名称:Zathura),一直到现在,我依然对于电影中的部分电脑特技印象深刻。  今天,大家选择上机考试,就是一种勇敢(brave)的选择;这个短学期,我们讲的是博弈(game)专题;所以,大家现在玩的也是“勇敢者的游戏”,这也是我命名这个题目的原因。  当然,除了