活动介绍

编写一个函数void ad(int a[M][N])找出一个M行N列(M、N为符号常量)的二维数组a中的“鞍点”。

时间: 2024-02-13 17:06:19 浏览: 134
好的,下面是函数void ad(int a[M][N])的实现: ```c++ #include <iostream> using namespace std; const int M = 3; // 行数 const int N = 4; // 列数 void ad(int a[M][N]) { for (int i = 0; i < M; i++) { int min_val = a[i][0]; // 找出第i行的最小值 int min_j = 0; // 最小值的列号 for (int j = 1; j < N; j++) { if (a[i][j] < min_val) { min_val = a[i][j]; min_j = j; } } bool is_saddle = true; // 是否为鞍点 for (int k = 0; k < M; k++) { if (a[k][min_j] > a[i][min_j]) { // 判断是否为鞍点 is_saddle = false; break; } } if (is_saddle) { // 输出鞍点 cout << "鞍点为:" << a[i][min_j] << endl; return; } } cout << "NO" << endl; } int main() { int a[M][N]; cout << "请输入" << M << "行" << N << "列的二维数组:" << endl; for (int i = 0; i < M; i++) { for (int j = 0; j < N; j++) { cin >> a[i][j]; } } ad(a); return 0; } ``` 在主函数中,我们首先输入了一个M行N列的二维数组a,然后将其作为实参调用了ad函数。 ad函数首先遍历每一行,找出每一行的最小值以及最小值所在的列号。接着对于每个最小值所在的列号,遍历每一行,判断该位置是否为鞍点。如果是,则输出鞍点,并返回;否则继续遍历下一行。如果所有行都遍历完成,仍然没有找到鞍点,则输出“NO”。
阅读全文

相关推荐

#include<bits/stdc++.h> #define ll long long using namespace std; const int N=1e5+5; template<class info,class tag> class xdtr{ public: #define cl ((x)*2) #define cr ((x)*2+1) vector<info> a; vector<tag> b; void push_down(int x){ a[cl]=a[cl]+b[x]; a[cr]=a[cr]+b[x]; b[x]=tag(); } void push_up(int x){ a[x]=a[cl]+a[cr]; } void init(int x,int l,int r,info w[]){ if(l==r){ a[x]=w[l]; return; } int mid=(l+r)/2; init(cl,l,mid,w); init(cr,mid+1,r,w); push_up(x); } xdtr(int l,int r,info w[]):a(r*4),b(r*4){ init(1,l,r,w); } void update(int x,int l,int r,tag w){ if((l<=a[x].l)&&(a[x].r<=r)){ a[x]=a[x]+w; b[x]=b[x]+w; return; } push_down(x); if(a[cl].r>=l)update(cl,l,r,w); if(a[cr].l<=r)update(cr,l,r,w); push_up(x); } info query(int x,int l,int r){ if((l<=a[x].l)&&(a[x].r<=r))return a[x]; push_down(x); if(a[cl].r<l)return query(cr,l,r); if(a[cr].l>r)return query(cl,l,r); return query(cl,l,r)+query(cr,l,r); } }; class tag1; class info1{ public: int l,r; int mx,mxl; info1(int wl=0,int wr=0,int wmx=0,int wmxl=0): l(wl), r(wr), mx(wmx), mxl(wmxl){} friend info1 operator+(info1 a,info1 b){ return info1( a.l, b.r, max(a.mx,b.mx), max(a.mxl,b.mxl) ); } friend info1 operator+(info1,tag1); }; class tag1{ public: int ad,adl; bool tnf; int tn,tnl; tag1(int wad=0,int wadl=0,bool wtnf=0,int wtn=0,int wtnl=0): ad(wad), adl(wadl), tnf(wtnf), tn(wtn), tnl(wtnl){} friend info1 operator+(info1 a,tag1 b){ if(b.tnf==0){ return info1( a.l, a.r, a.mx+b.ad, max(a.mxl,a.mx+b.adl) ); }else{ return info1( a.l, a.r, b.tn, max(max(a.mxl,a.mx+b.adl),b.tnl) ); } } friend tag1 operator+(tag1 a,tag1 b){ if((a.tnf==0)&&(b.tnf==0)){ return tag1( a.ad+b.ad, max(a.adl,a.ad+b.adl) ); }else if((a.tnf==1)&&(b.tnf==0)){ return tag1( 0, a.adl, 1, a.tn+b.ad, max(a.tnl,a.tn+b.adl) ); }else if((a.tnf==0)&&(b.tnf==1)){ return tag1( 0, max(a.adl,a.ad+b.adl), 1, b.tn, b.tnl ); }else{ return tag1( 0, a.adl, 1, b.tn, max(max(a.tnl,a.tn+b.adl),b.tnl) ); } } }; int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n; info1 a[N]; cin>>n; for(int i=1;i<=n;++i){ int x; cin>>x; a[i]=info1(i,i,x,x); } xdtr<info1,tag1>tr(1,n,a); int T; cin>>T; while(T--){ char op; cin>>op; if(op=='Q'){ int l,r; cin>>l>>r; cout<<tr.query(1,l,r).mx<<endl; }else if(op=='A'){ int l,r; cin>>l>>r; cout<<tr.query(1,l,r).mxl<<endl; }else if(op=='P'){ int l,r,x; cin>>l>>r>>x; tr.update(1,l,r,tag1(x,x)); }else{ int l,r,x; cin>>l>>r>>x; tr.update(1,l,r,tag1(0,0,1,x,x)); } } return 0; }debug 题目描述 Bob 需要一个程序来监视 CPU 使用率。这是一个很繁琐的过程,为了让问题更加简单,Bob 会慢慢列出今天会在用计算机时做什么事。 Bob 会干很多事,除了跑暴力程序看视频之外,还会做出去玩玩和用鼠标乱点之类的事,甚至会一脚踢掉电源……这些事有的会让做这件事的这段时间内 CPU 使用率增加或减少一个值;有的事还会直接让 CPU 使用率变为一个值。 当然 Bob 会询问:在之前给出的事件影响下,CPU 在某段时间内,使用率最高是多少。有时候 Bob 还会好奇地询问,在某段时间内 CPU 曾经的最高使用率是多少。 为了使计算精确,使用率不用百分比而用一个整数表示。 不保证 Bob 的事件列表没有出莫名的问题,使得使用率为负……………… 输入格式 第一行一个正整数 T T,表示 Bob 需要监视 CPU 的总时间。 然后第二行给出 T T 个数表示在你的监视程序执行之前,Bob 干的事让 CPU 在这段时间内每个时刻的使用率达已经达到了多少。 第三行给出一个整数 E E,表示 Bob 需要做的事和询问的总数。 接下来 E E 行每行表示给出一个询问或者列出一条事件: Q X Y:询问从 X X 到 Y Y 这段时间内 CPU 最高使用率。 A X Y:询问从 X X 到 Y Y 这段时间内之前列出的事件使 CPU 达到过的最高使用率。 P X Y Z:列出一个事件这个事件使得从 X X 到 Y Y 这段时间内 CPU 使用率增加 Z Z。 C X Y Z:列出一个事件这个事件使得从 X X 到 Y Y 这段时间内 CPU 使用率变为 Z Z。 时间的单位为秒,使用率没有单位。 X X 和 Y Y 均为正整数( X ≤ Y X≤Y), Z Z 为一个整数。 从 X X 到 Y Y 这段时间包含第 X X 秒和第 Y Y 秒。 保证必要运算在有符号 32 位整数以内。 输出格式 对于每个询问,输出一行一个整数回答。 输入输出样例 #1 输入 #1 10 -62 -83 -9 -70 79 -78 -31 40 -18 -5 20 A 2 7 A 4 4 Q 4 4 P 2 2 -74 P 7 9 -71 P 7 10 -8 A 10 10 A 5 9 C 1 8 10 Q 6 6 Q 8 10 A 1 7 P 9 9 96 A 5 5 P 8 10 -53 P 6 6 5 A 10 10 A 4 4 Q 1 5 P 4 9 -69 输出 #1 79 -70 -70 -5 79 10 10 79 79 -5 10 10

//===================================================================== // AD9854 驱动程序设计 //硬件连接: P0 ——Data; // P2 ——Adr; // RESET ——P3^7; // UDCLK ——P3^6; // WR ——P3.5; // RD ——p3.4; // FDATA ——P3^3; // OSK ——P3^2; // VDD--逻辑电源(3.3V) // VSS--GND(0V) //AD9854.c //康威电子工作室 //说明:本程序基于硬件的外接晶振为20MHZ //===================================================================== #include <AD9854.h> //STC单片机头文件 #include "stm32f10x.h" //#include "delay.h" uchar FreqWord[6]; //6个字节频率控制字 //**********************以下为系统时钟以及其相关变量设置************************** /* 此处根据自己的需要设置系统时钟以及与其相关的因子,一次需且只需开启一个 CLK_Set为时钟倍频设置,可设置4~20倍倍频,但最大不能超过300MHZ Freq_mult_ulong和Freq_mult_doulle均为2的48次方除以系统时钟,一个为长整形,一个为双精度型 */ /* #define CLK_Set 4 const ulong Freq_mult_ulong = 3518437; const double Freq_mult_doulle = 3518437.2088832; */ /* #define CLK_Set 5 const ulong Freq_mult_ulong = 2814750; const double Freq_mult_doulle = 2814749.76710656; */ /* #define CLK_Set 6 const ulong Freq_mult_ulong = 2345625; const double Freq_mult_doulle = 2345624.80592213; */ /* #define CLK_Set 7 const ulong Freq_mult_ulong = 2010536; const double Freq_mult_doulle = 2010535.54793326; */ /* #define CLK_Set 8 const ulong Freq_mult_ulong = 1759219; const double Freq_mult_doulle = 1759218.6044416; */ /* #define CLK_Set 9 const ulong Freq_mult_ulong = 1563750; const double Freq_mult_doulle = 1563749.87061476; */ /* #define CLK_Set 10 const ulong Freq_mult_ulong = 1407375; const double Freq_mult_doulle = 1407374.88355328; */ /* #define CLK_Set 11 const ulong Freq_mult_ulong = 1279432; const double Freq_mult_doulle = 1279431.712321164; */ #define CLK_Set 12 const ulong Freq_mult_ulong = 1172812; const double Freq_mult_doulle = 1172812.402961067; /* #define CLK_Set 13 const ulong Freq_mult_ulong = 1082596; const double Freq_mult_doulle = 1082596.064271754; */ /* #define CLK_Set 14 const ulong Freq_mult_ulong = 1005268; const double Freq_mult_doulle = 1005267.773966629; */ /* #define CLK_Set 15 const ulong Freq_mult_ulong = 938250; const double Freq_mult_doulle = 938249.9223688533; */ //**************************修改硬件时要修改的部分******************************** //**************************以下部分为函数定义******************************** static void AD9854_WR_Byte(u32 addr,u32 dat); extern void AD9854_Init(void); static void Freq_convert(long Freq); extern void AD9854_SetSine(ulong Freq,uint Shape); static void Freq_double_convert(double Freq); extern void AD9854_SetSine_double(double Freq,uint Shape); extern void AD9854_InitFSK(void); extern void AD9854_SetFSK(ulong Freq1,ulong Freq2); extern void AD9854_InitBPSK(void); extern void AD9854_SetBPSK(uint Phase1,uint Phase2); extern void AD9854_InitOSK(void); extern void AD9854_SetOSK(uchar RateShape); extern void AD9854_InitAM(void); extern void AD9854_SetAM(uint Shape); extern void AD9854_InitRFSK(void); extern void AD9854_SetRFSK(ulong Freq_Low,ulong Freq_High,ulong Freq_Up_Down,ulong FreRate); void AD9854_IO_Init(void) { GPIO_InitTypeDef GPIO_InitStructure ; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE); //使能PB,PE端口时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; GPIO_Init(GPIOB ,&GPIO_InitStructure) ; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6| GPIO_Pin_4| GPIO_Pin_5| GPIO_Pin_8| GPIO_Pin_2; GPIO_Init(GPIOA ,&GPIO_InitStructure) ; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All^(GPIO_Pin_14| GPIO_Pin_15); GPIO_Init(GPIOC ,&GPIO_InitStructure) ; } //==================================================================================== //函数名称:void AD9854_WR_Byte(uchar addr,uchar dat) //函数功能:AD9854并行口写入数据 //入口参数:addr 6位地址 // dat 写入的数据 //出口参数:无 //==================================================================================== u32 dat1,dat2; void AD9854_WR_Byte(u32 addr,u32 dat) { dat1= dat|(addr<<8); AD9854_AdrBus=(dat1&0x3fff)|((dat1^0x3fff)<<16); // AD9854_AdrBus = ((addr&0x3f)<<8) | ((addr^0x3f)<<(16+8)); // AD9854_DataBus = dat|(dat^0xff)<<16; // dat1 = ((addr&0x3f)<<8) | ((addr^0x3f)<<(16+8)); // dat2 = (dat1&0x3fff)|((dat1^0x3fff)<<16); AD9854_WR = 0; AD9854_WR = 1; } //==================================================================================== //函数名称:void AD9854_Init(void) //函数功能:AD9854初始化 //入口参数:无 //出口参数:无 //==================================================================================== void AD9854_Init(void) { AD9854_IO_Init(); AD9854_WR=1;//将读、写控制端口设为无效 AD9854_RD=1; AD9854_UDCLK=0; AD9854_RST=1; //复位AD9854 AD9854_RST=0; AD9854_WR_Byte(0x1d,0x00); //关闭比较器 AD9854_WR_Byte(0x1e,CLK_Set); //设置系统时钟倍频 AD9854_WR_Byte(0x1f,0x00); //设置系统为模式0,由外部更新 AD9854_WR_Byte(0x20,0x60); //设置为可调节幅度,取消插值补偿 AD9854_UDCLK=1; //更新AD9854输出 AD9854_UDCLK=0; } //==================================================================================== //函数名称:void Freq_convert(long Freq) //函数功能:正弦信号频率数据转换 //入口参数:Freq 需要转换的频率,取值从0~SYSCLK/2 //出口参数:无 但是影响全局变量FreqWord[6]的值 //说明: 该算法位多字节相乘算法,有公式FTW = (Desired Output Frequency × 2N)/SYSCLK // 得到该算法,其中N=48,Desired Output Frequency 为所需要的频率,即Freq,SYSCLK // 为可编程的系统时钟,FTW为48Bit的频率控制字,即FreqWord[6] //==================================================================================== void Freq_convert(long Freq) { ulong FreqBuf; ulong Temp=Freq_mult_ulong; uchar Array_Freq[4]; //将输入频率因子分为四个字节 Array_Freq[0]=(uchar)Freq; Array_Freq[1]=(uchar)(Freq>>8); Array_Freq[2]=(uchar)(Freq>>16); Array_Freq[3]=(uchar)(Freq>>24); FreqBuf=Temp*Array_Freq[0]; FreqWord[0]=FreqBuf; FreqBuf>>=8; FreqBuf+=(Temp*Array_Freq[1]); FreqWord[1]=FreqBuf; FreqBuf>>=8; FreqBuf+=(Temp*Array_Freq[2]); FreqWord[2]=FreqBuf; FreqBuf>>=8; FreqBuf+=(Temp*Array_Freq[3]); FreqWord[3]=FreqBuf; FreqBuf>>=8; FreqWord[4]=FreqBuf; FreqWord[5]=FreqBuf>>8; } //==================================================================================== //函数名称:void AD9854_SetSine(ulong Freq,uint Shape) //函数功能:AD9854正弦波产生程序 //入口参数:Freq 频率设置,取值范围为0~(1/2)*SYSCLK // Shape 幅度设置. 为12 Bit,取值范围为(0~4095) ,取值越大,幅度越大 //出口参数:无 //==================================================================================== void AD9854_SetSine(ulong Freq,uint Shape) { uchar count; uchar Adress; Adress = 0x04; //选择频率控制字地址的初值 Freq_convert(Freq); //频率转换 for(count=6;count>0;) //写入6字节的频率控制字 { AD9854_WR_Byte(Adress++,FreqWord[--count]); } AD9854_WR_Byte(0x21,Shape>>8); //设置I通道幅度 AD9854_WR_Byte(0x22,(uchar)(Shape&0xff)); AD9854_WR_Byte(0x23,Shape>>8); //设置Q通道幅度 AD9854_WR_Byte(0x24,(uchar)(Shape&0xff)); AD9854_UDCLK=1; //更新AD9854输出 AD9854_UDCLK=0; } //==================================================================================== //函数名称:void Freq_doublt_convert(double Freq) //函数功能:正弦信号频率数据转换 //入口参数:Freq 需要转换的频率,取值从0~SYSCLK/2 //出口参数:无 但是影响全局变量FreqWord[6]的值 //说明: 有公式FTW = (Desired Output Frequency × 2N)/SYSCLK得到该函数, // 其中N=48,Desired Output Frequency 为所需要的频率,即Freq,SYSCLK // 为可编程的系统时钟,FTW为48Bit的频率控制字,即FreqWord[6] //注意: 该函数与上面函数的区别为该函数的入口参数为double,可使信号的频率更精确 // 建议在100HZ以下用本函数,在高于100HZ的情况下用函数void Freq_convert(long Freq) //==================================================================================== void Freq_double_convert(double Freq) { ulong Low32; uint High16; double Temp=Freq_mult_doulle; //23ca99为2的48次方除以120M Freq*=(double)(Temp); // 1 0000 0000 0000 0000 0000 0000 0000 0000 = 4294967295 High16 =(int)(Freq/4294967295); //2^32 = 4294967295 Freq -= (double)High16*4294967295; Low32 = (ulong)Freq; FreqWord[0]=Low32; FreqWord[1]=Low32>>8; FreqWord[2]=Low32>>16; FreqWord[3]=Low32>>24; FreqWord[4]=High16; FreqWord[5]=High16>>8; } //==================================================================================== //函数名称:void AD9854_SetSine_double(double Freq,uint Shape) //函数功能:AD9854正弦波产生程序 //入口参数:Freq 频率设置,取值范围为0~1/2*SYSCLK // Shape 幅度设置. 为12 Bit,取值范围为(0~4095) //出口参数:无 //==================================================================================== void AD9854_SetSine_double(double Freq,uint Shape) { uchar count=0; uchar Adress; Adress=0x04; //选择频率控制字1地址的初值 Freq_double_convert(Freq); //频率转换 for(count=6;count>0;) //写入6字节的频率控制字 { AD9854_WR_Byte(Adress++,FreqWord[--count]); } AD9854_WR_Byte(0x21,Shape>>8); //设置I通道幅度 AD9854_WR_Byte(0x22,(uchar)(Shape&0xff)); AD9854_WR_Byte(0x23,Shape>>8); //设置Q通道幅度 AD9854_WR_Byte(0x24,(uchar)(Shape&0xff)); AD9854_UDCLK=1; //更新AD9854输出 AD9854_UDCLK=0; } //==================================================================================== //函数名称:void AD9854_InitFSK(void) //函数功能:AD9854的FSK初始化 //入口参数:无 //出口参数:无 //==================================================================================== void AD9854_InitFSK(void) { AD9854_WR=1; //将读、写控制端口设为无效 AD9854_RD=1; AD9854_UDCLK=0; AD9854_RST=1; //复位AD9854 AD9854_RST=0; AD9854_WR_Byte(0x1d,0x00); //关闭比较器 AD9854_WR_Byte(0x1e,CLK_Set); //设置系统时钟倍频 AD9854_WR_Byte(0x1f,0x02); //设置系统为模式1,由外部更新 AD9854_WR_Byte(0x20,0x60); //设置为可调节幅度,取消插值补偿 AD9854_UDCLK=1; //更新AD9854输出 AD9854_UDCLK=0; } //==================================================================================== //函数名称:void AD9854_SetFSK(ulong Freq1,ulong Freq2) //函数功能:AD9854的FSK设置 //入口参数:Freq1 FSK频率1 // Freq2 FSK频率2 //出口参数:无 //==================================================================================== void AD9854_SetFSK(ulong Freq1,ulong Freq2) { uchar count=6; uchar Adress1,Adress2; const uint Shape=4000; //幅度设置. 为12 Bit,取值范围为(0~4095) Adress1=0x04; //选择频率控制字1地址的初值 Adress2=0x0a; //选择频率控制字2地址的初值 Freq_convert(Freq1); //频率转换1 for(count=6;count>0;) //写入6字节的频率控制字 { AD9854_WR_Byte(Adress1++,FreqWord[--count]); } Freq_convert(Freq2); //频率转换2 for(count=6;count>0;) //写入6字节的频率控制字 { AD9854_WR_Byte(Adress2++,FreqWord[--count]); } AD9854_WR_Byte(0x21,Shape>>8); //设置I通道幅度 AD9854_WR_Byte(0x22,(uchar)(Shape&0xff)); AD9854_WR_Byte(0x23,Shape>>8); //设置Q通道幅度 AD9854_WR_Byte(0x24,(uchar)(Shape&0xff)); AD9854_UDCLK=1; //更新AD9854输出 AD9854_UDCLK=0; } //==================================================================================== //函数名称:void AD9854_InitBPSK(void) //函数功能:AD9854的BPSK初始化 //入口参数:无 //出口参数:无 //==================================================================================== void AD9854_InitBPSK(void) { AD9854_WR=1; //将读、写控制端口设为无效 AD9854_RD=1; AD9854_UDCLK=0; AD9854_RST=1; //复位AD9854 AD9854_RST=0; AD9854_WR_Byte(0x1d,0x00); //关闭比较器 AD9854_WR_Byte(0x1e,CLK_Set); //设置系统时钟倍频 AD9854_WR_Byte(0x1f,0x08); //设置系统为模式4,由外部更新 AD9854_WR_Byte(0x20,0x60); //设置为可调节幅度,取消插值补偿 AD9854_UDCLK=1; //更新AD9854输出 AD9854_UDCLK=0; } //==================================================================================== //函数名称:void AD9854_SetBPSK(uint Phase1,uint Phase2) //函数功能:AD9854的BPSK设置 //入口参数:Phase1 调制相位1 // Phase2 调制相位2 //出口参数:无 //说明: 相位为14Bit,取值从0~16383,建议在用本函数的时候将Phase1设置为0, // 将Phase1设置为8192,180°相位 //==================================================================================== void AD9854_SetBPSK(uint Phase1,uint Phase2) { uchar count; const ulong Freq=60000; const uint Shape=4000; uchar Adress; Adress=0x04; //选择频率控制字1地址的初值 AD9854_WR_Byte(0x00,Phase1>>8); //设置相位1 AD9854_WR_Byte(0x01,(uchar)(Phase1&0xff)); AD9854_WR_Byte(0x02,Phase2>>8); //设置相位2 AD9854_WR_Byte(0x03,(uchar)(Phase2&0xff)); Freq_convert(Freq); //频率转换 for(count=6;count>0;) //写入6字节的频率控制字 { AD9854_WR_Byte(Adress++,FreqWord[--count]); } AD9854_WR_Byte(0x21,Shape>>8); //设置I通道幅度 AD9854_WR_Byte(0x22,(uchar)(Shape&0xff)); AD9854_WR_Byte(0x23,Shape>>8); //设置Q通道幅度 AD9854_WR_Byte(0x24,(uchar)(Shape&0xff)); AD9854_UDCLK=1; //更新AD9854输出 AD9854_UDCLK=0; } //==================================================================================== //函数名称:void AD9854_InitOSK(void) //函数功能:AD9854的OSK初始化 //入口参数:无 //出口参数:无 //==================================================================================== void AD9854_InitOSK(void) { AD9854_WR=1; //将读、写控制端口设为无效 AD9854_RD=1; AD9854_UDCLK=0; AD9854_RST=1; //复位AD9854 AD9854_RST=0; AD9854_WR_Byte(0x1d,0x00); //关闭比较器 AD9854_WR_Byte(0x1e,CLK_Set); //设置系统时钟倍频 AD9854_WR_Byte(0x1f,0x00); //设置系统为模式0,由外部更新 AD9854_WR_Byte(0x20,0x70); //设置为可调节幅度,取消插值补偿,通断整形内部控制 AD9854_UDCLK=1; //更新AD9854输出 AD9854_UDCLK=0; } //==================================================================================== //函数名称:void AD9854_SetOSK(uchar RateShape) //函数功能:AD9854的OSK设置 //入口参数: RateShape OSK斜率,取值为4~255,小于4则无效 //出口参数:无 //==================================================================================== void AD9854_SetOSK(uchar RateShape) { uchar count; const ulong Freq=60000; //设置载频 const uint Shape=4000; //幅度设置. 为12 Bit,取值范围为(0~4095) uchar Adress; Adress=0x04; //选择频率控制字地址的初值 Freq_convert(Freq); //频率转换 for(count=6;count>0;) //写入6字节的频率控制字 { AD9854_WR_Byte(Adress++,FreqWord[--count]); } AD9854_WR_Byte(0x21,Shape>>8); //设置I通道幅度 AD9854_WR_Byte(0x22,(uchar)(Shape&0xff)); AD9854_WR_Byte(0x23,Shape>>8); //设置Q通道幅度 AD9854_WR_Byte(0x24,(uchar)(Shape&0xff)); AD9854_WR_Byte(0x25,RateShape); //设置OSK斜率 AD9854_UDCLK=1; //更新AD9854输出 AD9854_UDCLK=0; } //==================================================================================== //函数名称:void AD9854_InitAM(void) //函数功能:AD9854的AM初始化 //入口参数:无 //出口参数:无 //==================================================================================== void AD9854_InitAM(void) { uchar count; const ulong Freq=60000; //设置载频 uchar Adress; Adress=0x04; //选择频率控制字地址的初值 AD9854_WR=1; //将读、写控制端口设为无效 AD9854_RD=1; AD9854_UDCLK=0; AD9854_RST=1; //复位AD9854 AD9854_RST=0; AD9854_WR_Byte(0x1d,0x00); //关闭比较器 AD9854_WR_Byte(0x1e,CLK_Set); //设置系统时钟倍频 AD9854_WR_Byte(0x1f,0x00); //设置系统为模式0,由外部更新 AD9854_WR_Byte(0x20,0x60); //设置为可调节幅度,取消插值补偿 Freq_convert(Freq); //频率转换 for(count=6;count>0;) //写入6字节的频率控制字 { AD9854_WR_Byte(Adress++,FreqWord[--count]); } AD9854_UDCLK=1; //更新AD9854输出 AD9854_UDCLK=0; } //==================================================================================== //函数名称:void AD9854_SetAM(uchar Shape) //函数功能:AD9854的AM设置 //入口参数:Shape 12Bit幅度,取值从0~4095 //出口参数:无 //==================================================================================== void AD9854_SetAM(uint Shape) { AD9854_WR_Byte(0x21,Shape>>8); //设置I通道幅度 AD9854_WR_Byte(0x22,(uchar)(Shape&0xff)); AD9854_WR_Byte(0x23,Shape>>8); //设置Q通道幅度 AD9854_WR_Byte(0x24,(uchar)(Shape&0xff)); AD9854_UDCLK=1; //更新AD9854输出 AD9854_UDCLK=0; } //==================================================================================== //函数名称:void AD9854_InitRFSK(void) //函数功能:AD9854的RFSK初始化 //入口参数:无 //出口参数:无 //==================================================================================== void AD9854_InitRFSK(void) { AD9854_WR=1; //将读、写控制端口设为无效 AD9854_RD=1; AD9854_UDCLK=0; AD9854_RST=1; //复位AD9854 AD9854_RST=0; AD9854_WR_Byte(0x1d,0x00); //关闭比较器 AD9854_WR_Byte(0x1e,CLK_Set); //设置系统时钟倍频 AD9854_WR_Byte(0x1f,0x24); //设置系统为模式2,由外部更新,使能三角波扫频功能 AD9854_WR_Byte(0x20,0x60); //设置为可调节幅度,取消插值补偿 AD9854_UDCLK=1; //更新AD9854输出 AD9854_UDCLK=0; } //==================================================================================== //函数名称:void AD9854_SetRFSK(void) //函数功能:AD9854的RFSK设置 //入口参数:Freq_Low RFSK低频率 48Bit // Freq_High RFSK高频率 48Bit // Freq_Up_Down 步进频率 48Bit // FreRate 斜率时钟控制 20Bit //出口参数:无 //注: 每两个脉冲之间的时间周期用下式表示(FreRate +1)*(System Clock ),一个脉冲, // 频率 上升或者下降 一个步进频率 //==================================================================================== void AD9854_SetRFSK(ulong Freq_Low,ulong Freq_High,ulong Freq_Up_Down,ulong FreRate) { uchar count=6; uchar Adress1,Adress2,Adress3; const uint Shape=4000; //幅度设置. 为12 Bit,取值范围为(0~4095) Adress1=0x04; //选择频率控制字地址的初值 Adress2=0x0a; Adress3=0x10; Freq_convert(Freq_Low); //频率1转换 for(count=6;count>0;) //写入6字节的频率控制字 { AD9854_WR_Byte(Adress1++,FreqWord[--count]); } Freq_convert(Freq_High); //频率2转换 for(count=6;count>0;) //写入6字节的频率控制字 { AD9854_WR_Byte(Adress2++,FreqWord[--count]); } Freq_convert(Freq_Up_Down); //步进频率转换 for(count=6;count>0;) //写入6字节的频率控制字 { AD9854_WR_Byte(Adress3++,FreqWord[--count]); } AD9854_WR_Byte(0x1a,(uchar)((FreRate>>16)&0x0f)); //设置斜升速率 AD9854_WR_Byte(0x1b,(uchar)(FreRate>>8)); AD9854_WR_Byte(0x1c,(uchar)FreRate); AD9854_WR_Byte(0x21,Shape>>8); //设置I通道幅度 AD9854_WR_Byte(0x22,(uchar)(Shape&0xff)); AD9854_WR_Byte(0x23,Shape>>8); //设置Q通道幅度 AD9854_WR_Byte(0x24,(uchar)(Shape&0xff)); AD9854_UDCLK=1; //更新AD9854输出 AD9854_UDCLK=0; } //测试正弦波,采用120MHZ SYSCLK时,出来10MHZ波形,波形很好,测试成功 //当采用300MHZ SYSCLK时,测试50MHZ波形时,DDS发热厉害,且波形衰减严重,幅度在35mV左右 // //int main() //{ // AD9854_Init(); // AD9854_SetSine(80000000,4095); // while(1); //} //测试正弦波,采用120MHZ SYSCLK时,出来87.697HZ波形,波形很好,测试成功 // //int main() //{ // AD9854_Init(); // AD9854_SetSine_double(87.697,4000); // while(1); //} //测试FSK,采用120MHZ SYSCLK,1K和6K,测试成功,结果对应"FSK波形.bmp" //int main() //{ // AD9854_InitFSK(); // AD9854_SetFSK(1000,6000); // while(1) // { // AD9854_FDATA = 1; // delay_us(30000); //延时时间长,便于观察 // AD9854_FDATA = 0; // delay_us(30000); // } //} //测试BPSK,采用120MHZ SYSCLK,测试成功 //int main() //{ // AD9854_InitBPSK(); // AD9854_SetBPSK(0,8192); // while(1) // { // AD9854_FDATA = 1; // delay_us(10); // AD9854_FDATA = 0; // delay_us(10); // } //} //测试OSK,采用120MHZ SYSCLK,测试成功 //int main() //{ // AD9854_InitOSK(); // AD9854_SetOSK(10); // while(1) // { // AD9854_OSK=1; // delay_us(30); // AD9854_OSK=0; // delay_us(30); // } //} //测试AM,采用120MHZ SYSCLK,测试成功 //int main() //{ // AD9854_InitAM(); // while(1) // { // AD9854_SetAM(2000); // delay_us(10); // AD9854_SetAM(4000); // delay_us(10); // } //} // //测试RFSK,采用120MHZ SYSCLK,测试成功 //int main() //{ // AD9854_InitRFSK(); // AD9854_SetRFSK(1000,60000,100,30); // while(1) // { // AD9854_FDATA = 1; // delay_us(30000); //延时时间长,便于观察 // AD9854_FDATA = 0; // delay_us(30000); // } //} zet6和ad的引脚怎么连

//#pragma GCC optimize(2,3,“Ofast”,“inline”, “-ffast-math”) //#pragma GCC target(“avx,sse2,sse3,sse4,mmx”) #include #include #include #include #include #include #include #include #include<unordered_map> #include #include #include #include #include #include #include #define fi first #define se second #define pb push_back #define y1 hsduaishxu #define mkp make_pair using namespace std; typedef long long ll; typedef long double ld; typedef unsigned long long ull; typedef pair<int,int> pii; typedef pair<ll,int> pli; typedef pair<int,ll> pil; typedef pair<ll,ll> pll; typedef unsigned int uint; typedef vector vpii; typedef int128 i128; const int maxn=1000005; const ll mod=1000000007; inline int Min(int x,int y){return x<y?x:y;} inline int Max(int x,int y){return x>y?x:y;} inline ll Min(ll x,ll y){return x<y?x:y;} inline ll Max(ll x,ll y){return x>y?x:y;} inline void ad(int &x,int y,int z){x=y+z;if(x>=mod) x-=mod;} inline void ad(ll &x,ll y,ll z){x=y+z;if(x>=mod) x-=mod;} inline void ad(int &x,int y){x+=y;if(x>=mod) x-=mod;} inline void ad(int &x,ll y){x+=y;if(x>=mod) x-=mod;} inline void ad(ll &x,ll y){x+=y;if(x>=mod) x-=mod;} inline void siu(int &x,int y,int z){x=y-z;if(x<0) x+=mod;} inline void siu(int &x,int y){x-=y;if(x<0) x+=mod;} inline void siu(ll &x,ll y){x-=y;if(x<0) x+=mod;} inline ll myabs(ll x){return x<0?-x:x;} inline void tmn(int &x,int y){if(y<x) x=y;} inline void tmx(int &x,int y){if(y>x) x=y;} inline void tmn(ll &x,ll y){if(y<x) x=y;} inline void tmx(ll &x,ll y){if(y>x) x=y;} ll qpow(ll aa,ll bb){ll res=1;while(bb){if(bb&1) res=resaa%mod;aa=aaaa%mod;bb>>=1;}return res;} ll qpow(ll aa,ll bb,ll md){ll res=1;while(bb){if(bb&1) res=(i128)resaa%md;aa=(i128)aaaa%md;bb>>=1;}return res;} inline ll Inv(ll x,ll md){return qpow(x,md-2,md);} inline ll Inv(ll x){return qpow(x,mod-2);} int _,; int n,k; int p[maxn],q[maxn]; ll ans; vector g[maxn],h[maxn]; int r1,r2; int siz[maxn],dfn[maxn],dfscnt; void dfs(int u) { siz[u]=1;dfn[u]=dfscnt; for(auto v:g[u]) dfs(v),siz[u]+=siz[v]; } struct bit { int c[maxn]; void clr() { for(int i=1;i<=n;i) c[i]=0; } int lowbit(int x){return x&(-x);} void ad(int x,int k){while(x<=n){c[x]+=k;x+=lowbit(x);}} int qry(int x){int res=0;while(x>=1){res+=c[x];x-=lowbit(x);}return res;} }T1,T2; int F[maxn],st[maxn],tp,sz[maxn],son[maxn]; vector e[maxn]; void dfs1(int u) { st[tp]=u;e[u].clear(); if(tp>k) F[u]=st[tp-k]; else F[u]=0; if(F[u]) e[F[u]].push_back(u); sz[u]=1;son[u]=0; for(auto v:h[u]) { dfs1(v); if(sz[v]>sz[son[u]]) son[u]=v; sz[u]+=sz[v]; } tp–; } void ins(int x,int k) { T1.ad(dfn[x],k);T1.ad(dfn[x]+siz[x],-k); T2.ad(dfn[x],k); } int qry(int x) { return T1.qry(dfn[x])+T2.qry(dfn[x]+siz[x]-1)-T2.qry(dfn[x]-1); } void dfs3(int u,int ty) { for(auto v:e[u]) { if(ty1) ans+=qry(v); else if(ty3) ins(v,-1); else if(ty==2) ins(v,1); } for(auto v:h[u]) dfs3(v,ty); } void dfs2(int u,int ty) { for(auto v:h[u]) if(v!=son[u]) dfs2(v,0); if(son[u]) { dfs2(son[u],1); for(auto v:h[u]) if(v!=son[u]) dfs3(v,1),dfs3(v,2); } for(auto v:e[u]) ins(v,1); if(!ty) dfs3(u,3); } void cal() { dfscnt=0;dfs(r1); T1.clr();T2.clr(); tp=0;dfs1(r2); dfs2(r2,0); } void solve() { cin>>n>>k; for(int i=1;i<=n;i) cin>>p[i]; for(int i=1;i<=n;i++) cin>>q[i]; for(int i=1;i<=n;i++) { if(!p[i]) r1=i; else g[p[i]].push_back(i); if(!q[i]) r2=i; else h[q[i]].push_back(i); } cal(); for(int i=1;i<=n;i++) swap(p[i],q[i]),swap(g[i],h[i]);swap(r1,r2); cal(); cout<<ans<<“\n”; } signed main() { freopen(“D.in”,“r”,stdin); freopen(“D.out”,“w”,stdout); ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); =1; //cin>>; while(_–) { solve(); } return 0; } //by cristiano ronaldo dos santos aveiro #include <bits/stdc++.h> using namespace std; typedef long long ll; #define rep(i,s,t) for(register ll i = s;i <= t;++i) #define per(i,t,s) for(register ll i = t;i >= s;–i) const ll N = 1e6 + 5; ll n; ll k; ll rt1; ll rt2; ll top; ll idx; ll ans; ll p[N] = {}; ll q[N] = {}; ll fa[N] = {}; ll st[N] = {}; ll sz[N] = {}; ll siz[N] = {}; ll dfn[N] = {}; ll son[N] = {}; vector g[N]; vector g1[N]; vector g2[N]; class binary_indexed_tree { private: ll t[N] = {}; public: inline void init() { memset(t,0,sizeof(t)); } inline ll lowbit(ll x) { return x & (-x); } inline void upd(ll x,ll k) { while(x <= n) { t[x] += k; x += lowbit(x); } } inline ll qry(ll x) { ll ans = 0; while(x) { ans += t[x]; x -= lowbit(x); } return ans; } }; binary_indexed_tree t1; binary_indexed_tree t2; inline ll read() { ll x = 0; ll y = 1; char c = getchar(); while(c < ‘0’ || c > ‘9’) { if(c == ‘-’) y = -y; c = getchar(); } while(c >= ‘0’ && c <= ‘9’) { x = (x << 3) + (x << 1) + (c ^ ‘0’); c = getchar(); } return x * y; } inline void write(ll x) { if(x < 0) { putchar(‘-’); write(-x); return; } if(x > 9) write(x / 10); putchar(x % 10 + ‘0’); } inline void dfs(ll u) { siz[u] = 1; dfn[u] = ++idx; for(register auto v : g1[u]) { dfs(v); siz[u] += siz[v]; } } inline void dfs1(ll u) { st[++top] = u; g[u].clear(); if(top > k) fa[u] = st[top - k]; else fa[u] = 0; if(fa[u]) g[fa[u]].push_back(u); sz[u] = 1; son[u] = 0; for(auto v : g2[u]) { dfs1(v); if(sz[v] > sz[son[u]]) son[u] = v; sz[u] += sz[v]; } top–; } inline void ins(ll x,ll k) { t1.upd(dfn[x],k); t1.upd(dfn[x] + siz[x],-k); t2.upd(dfn[x],k); } inline ll query(ll x) { return t1.qry(dfn[x]) + t2.qry(dfn[x] + siz[x] - 1) - t2.qry(dfn[x] - 1); } inline void dfs3(ll u,ll k) { for(auto v : g[u]) { if(k == 1) ans += query(v); else if(k == 2) ins(v,1); else if(k == 3) ins(v,-1); } for(auto v : g2[u]) dfs3(v,k); } inline void dfs2(ll u,ll k) { for(auto v : g2[u]) if(v != son[u]) dfs2(v,0); if(son[u]) { dfs2(son[u],1); for(auto v : g2[u]) { if(v != son[u]) { dfs3(v,1); dfs3(v,2); } } } for(register auto v : g[u]) ins(v,1); if(!k) dfs3(u,3); } int main() { freopen(“D.in”,“r”,stdin); freopen(“D.out”,“w”,stdout); n = read(); k = read(); rep(i,1,n) p[i] = read(); rep(i,1,n) q[i] = read(); rep(i,1,n) { if(!p[i]) rt1 = i; else g1[p[i]].push_back(i); if(!q[i]) rt2 = i; else g2[q[i]].push_back(i); } idx = 0; dfs(rt1); t1.init(); t2.init(); top = 0; dfs1(rt2); dfs2(rt2,0); rep(i,1,n) { swap(p[i],q[i]); swap(g1[i],g2[i]); swap(rt1,rt2); } idx = 0; dfs(rt1); t1.init(); t2.init(); top = 0; dfs1(rt2); dfs2(rt2,0); write(ans); fclose(stdin); fclose(stdout); return 0; }针对以下问题,上述两段代码的功能有什么不同,请指出并修正第二段代码,使得第二段代码功能与第一段代码功能完全等价小丁的树 题目描述 小丁拥有两棵均具有 n n 个顶点,编号集合为 { 1 , 2 , ⋯   , n } {1,2,⋯,n} 的有根树 T 1 , T 2 T 1 ​ ,T 2 ​ ,现在他需要计算这两棵树的相似程度。 为了计算,小丁定义了对于一棵树 T T 和 T T 上两个不同顶点 u , v u,v 的距离函数 d T ( u , v ) d T ​ (u,v),其定义为 u , v u,v 两个点距离成为祖先关系有多近,具体来说,对于所有在 T T 上为祖先关系的点对 ( u ′ , v ′ ) (u ′ ,v ′ ), dis ⁡ ( u , u ′ ) + dis ⁡ ( v , v ′ ) dis(u,u ′ )+dis(v,v ′ ) 的最小值即为 d T ( u , v ) d T ​ (u,v) 的值,其中 dis ⁡ ( u , v ) dis(u,v) 表示 u , v u,v 在树 T T 上的唯一简单路径包含的边数,即 u , v u,v 的距离。 点对 ( u ′ , v ′ ) (u ′ ,v ′ ) 为祖先关系,当且仅当 u ′ u ′ 是 v ′ v ′ 的祖先或 v ′ v ′ 是 u ′ u ′ 的祖先。(注意,每个点都是自己的祖先) 小丁心里还有一个参数 k k,如果节点对 ( u , v ) (u,v) 满足以下条件,称之为不相似的节点对: 1 ≤ u < v ≤ n 1≤u<v≤n " d T 1 ( u , v ) = 0 d T 1 ​ ​ (u,v)=0 且 d T 2 ( u , v ) > k d T 2 ​ ​ (u,v)>k“ 或 " d T 2 ( u , v ) = 0 d T 2 ​ ​ (u,v)=0 且 d T 1 ( u , v ) > k d T 1 ​ ​ (u,v)>k​“ 小丁认为,不相似的节点对越多, T 1 T 1 ​ 和 T 2 T 2 ​ 就越不相似,你能告诉他总共有多少不相似的节点对吗? 输入格式 第一行两个整数 n , k n,k,表示 T 1 T 1 ​ 和 T 2 T 2 ​ 的节点数和参数 k k。 第二行 n n 个正整数 p 1 , p 2 , ⋯   , p n p 1 ​ ,p 2 ​ ,⋯,p n ​ , T 1 T 1 ​ 中节点 i i 的父节点为 p i p i ​ ,特别的,若 p i = 0 p i ​ =0,则 i i 是 T 1 T 1 ​ 的根。 第三行 n n 个正整数 q 1 , q 2 , ⋯   , q n q 1 ​ ,q 2 ​ ,⋯,q n ​ , T 2 T 2 ​ 中节点 i i 的父节点为 q i q i ​ ,特别的,若 q i = 0 q i ​ =0,则 i i 是 T 2 T 2 ​ 的根。 输出格式 一行一个整数,表示不相似的节点对总数。 样例 1 输入 5 0 0 1 1 2 3 5 3 1 1 0 样例 1 输出 4 样例 1 解释 ( 2 , 3 ) , ( 2 , 4 ) , ( 2 , 5 ) , ( 4 , 5 ) (2,3),(2,4),(2,5),(4,5) 为不相似的节点对。 其余样例见下发文件。 数据规模与约定 对于所有数据, 1 ≤ n ≤ 2 × 10 5 , 0 ≤ k < n , 0 ≤ p i , q i ≤ n 1≤n≤2×10 5 ,0≤k<n,0≤p i ​ ,q i ​ ≤n,且由 p i , q i p i ​ ,q i ​ 形成的是一棵 n n 个节点的有根树。 本题采用捆绑评测,你只有通过了一个子任务中所有测试点才能得到该子任务的分数。 Subtask 1(10pts): 1 ≤ n ≤ 100 1≤n≤100。 Subtask 2(20pts): 1 ≤ n ≤ 3000 1≤n≤3000。 Subtask 3(20pts): k = 0 k=0。 Subtask 4(10pts): 0 ≤ k ≤ 20 0≤k≤20。 Subtask 5(40pts):无特殊限制。

void menu(); void ad1(); void ct(); void ad12(); void de(); void output(); void order1(); void read(); void search(); void save(); int ex(); void checkout(); void chake(); void denlu(); int main() { menu(); return 0; } struct meau { int num;//菜品编码 char name[1000]; int price; struct meau *next; }*head = NULL; struct desk { int people; int grcd[50];//个人菜单的里的编码 int sl;//点菜的数量 int sum; } desk1[200]; void menu() { system("cls"); int n; printf("\t\t----------------------------------\n"); printf("\t\t| 欢迎来到米奇零10星餐厅 |\n"); printf("\t\t----------------------------------\n"); printf("\t\t| 1.顾客点餐系统 |\n"); printf("\t\t| 2.管理员系统 |\n"); printf("\t\t| 3.退出系统 |\n"); printf("\t\t----------------------------------\n"); printf("请输入你的选择:"); scanf("%d", &n); switch (n) { case 1: ct(); break; case 2: denlu(); break; case 3: save(); printf("感谢使用,再见!\n"); exit(0); break; default: printf("\n"); printf("\t\t----------------------------------\n"); printf("\t\t| 选择错误请重新选择 |\n"); printf("\t\t----------------------------------\n"); printf("\n"); system("pause"); menu(); } } void ct() { system("cls"); int n; printf("\t\t----------------------------------\n"); printf("\t\t| 欢迎来到米奇零10星餐厅 |\n"); printf("\t\t----------------------------------\n"); printf("\t\t| 1.点餐系统 |\n"); printf("\t\t| 2.查询 |\n"); printf("\t\t| 3.返回 |\n"); printf("\t\t----------------------------------\n"); printf("今日菜品有如下:\n"); read(); output(); //餐桌信息 printf("----------------------------------------\n"); printf("| 1.点餐 |\n"); printf("| 2.查询 |\n"); printf("| 3.返回 |\n"); printf("----------------------------------------\n"); printf("请输入你的选择【1 - 3】:"); scanf("%d", &n); switch (n) { case 1: order1(); break; case 2: search(); system("pause"); ct(); break; case 3: menu(); break; default: printf("\n"); printf("----------------------------------------\n"); printf("| 选择错误请重新选择 | \n"); printf("----------------------------------------\n"); printf("\n"); system("pause"); ct(); } } void denlu() { FILE *fp; int ctwd; int stwd; fp = fopen("passwd.txt", "r"); if (fp == NULL) { fp = fopen("passwd.txt", "w"); if (fp == NULL) { printf("无法创建密码文件!\n"); return; } fprintf(fp, "123456"); fclose(fp); printf("已创建密码文件,默认密码为:123456\n"); system("pause"); ad12(); return; } if (fscanf(fp, "%d", &stwd) != 1) { printf("密码文件格式错误!\n"); fclose(fp); return; } fclose(fp); printf("请输入管理员密码:"); scanf("%d", &ctwd); if (ctwd == stwd) { printf("密码验证成功,进入管理员系统!\n"); system("pause"); ad12(); } else { printf("密码错误,请重新输入!\n"); system("pause"); denlu(); } } void changePassword() { FILE *fp; int old, new, con; fp = fopen("passwd.txt", "r"); if (fp == NULL) { printf("密码文件不存在,无法修改密码!\n"); system("pause"); return; } fscanf(fp, "%d", &old); fclose(fp); printf("请输入当前密码:"); scanf("%d", &old); if (old != old) { printf("旧密码输入错误,无法修改密码!\n"); system("pause"); return; } printf("请输入新密码:"); scanf("%d", &new); printf("请再次输入新密码:"); scanf("%d", &con); if (new != con) { printf("两次输入的密码不一致,修改失败!\n"); system("pause"); return; } fp = fopen("passwd.txt", "w"); if (fp == NULL) { printf("无法打开密码文件,修改失败!\n"); system("pause"); return; } fprintf(fp, "%d", new); fclose(fp); printf("密码修改成功!\n"); system("pause"); ad12(); } void ad12() { system("cls"); int n; struct meau *p, *q; system("cls"); printf("\t\t----------------------------------\n"); printf("\t\t| 欢迎来到管理者系统界面 |\n"); printf("\t\t----------------------------------\n"); printf("\t\t| 1.添加菜品 |\n"); printf("\t\t| 2.删除菜品 |\n"); printf("\t\t| 3.结账删除 |\n"); printf("\t\t| 4.查看订单 |\n"); printf("\t\t| 5.返回主菜单 |\n"); printf("\t\t| 6.更改管理员密码 |\n"); printf("\t\t----------------------------------\n"); scanf("%d", &n); switch (n) { case 1: q = (struct meau *)malloc(sizeof (struct meau)); //申请空间 printf("请输入要添加的菜品:\n"); printf("编号:"); scanf("%d", &q->num); getchar(); printf("名称:"); gets(q->name); printf("价格;"); scanf("%d", &q->price); q->next = NULL; p = q; head = q; while (1) { printf("是否继续添加菜品?\n"); printf(" 1.是 2.否\n"); int n; scanf("%d", &n); if (n == 1) { q = (struct meau *)malloc(sizeof (struct meau)); //申请空间 printf("请输入要添加的菜品:\n"); printf("编号:"); scanf("%d", &q->num); getchar(); printf("名称:"); gets(q->name); printf("价格;"); scanf("%d", &q->price); q->next = NULL;//尾部 p->next = q; p = p->next; } else if (n == 2) { printf("添加结束!\n"); system("pause"); save(); ad12(); break; } else { printf("\n"); printf("----------------------------------------\n"); printf("| 选择错误请重新选择 | \n"); printf("----------------------------------------\n"); printf("\n"); system("pause"); ad12(); break; } } break; case 2: read(); de(); break; case 3: checkout(); break; case 4: chake(); break; case 5: menu(); break; case 6: changePassword(); break; default: printf("\n"); printf("----------------------------------------\n"); printf("| 选择错误请重新选择 | \n"); printf("----------------------------------------\n"); printf("\n"); system("pause"); ad12(); } } void de() { printf("\t\t**********************************\n"); printf("\t\t* 欢迎进入删除系统 *\n"); printf("\t\t* 1.确认删除 *\n"); printf("\t\t* 2.放弃删除 *\n"); printf("\t\t* 3.返回主界面 *\n"); printf("\t\t**********************************\n"); int n, dem; scanf("%d", &n); struct meau *p, *q; // p遍历,q记录前一个节点 switch (n) { case 1: output(); printf("输入你要删除菜品的编号:\n"); scanf("%d", &dem); p = head; q = NULL; while (p != NULL) { if (p->num == dem) { printf("编号"); printf("\t\t\t菜名"); printf("\t\t\t\t价格\n"); printf("%d", p->num); printf("\t\t\t%s", p->name); printf("\t\t\t\t%d元\n", p->price); if (q == NULL) { head = p->next; } else { q->next = p->next; } free(p); printf("\n"); printf("*************************************\n"); printf("** 删除成功 **\n"); printf("*************************************\n"); printf("\n"); system("pause"); save(); de(); } q = p; p = p->next; } printf("\n"); printf("*************************************\n"); printf("** 未找到该菜品,删除失败 **\n"); printf("*************************************\n"); printf("\n"); system("pause"); save(); de(); break; case 2: ad12(); break; case 3: ad12(); break; default: printf("\n"); printf("----------------------------------------\n"); printf("| 选择错误请重新选择 | \n"); printf("----------------------------------------\n"); printf("\n"); system("pause"); de(); break; } } void output() { struct meau *p; printf("编号"); printf("\t\t\t菜名"); printf("\t\t\t\t价格\n"); for (p = head; p != NULL; p = p->next) { printf("%d", p->num); printf("\t\t\t%s", p->name); printf("\t\t\t\t%d元\n", p->price); } } void save() { int n; struct meau *p; p = head; FILE *fp; fp = fopen("meau.txt", "w+"); do { fprintf(fp, ("%d\t\t%s\t\t%d\n"), p->num, p->name, p->price); p = p->next; } while (p != NULL); system("pause"); printf("数据已经保存!!!!"); fclose(fp); } void read() { struct meau *p, *t = NULL; FILE *fp; fp = fopen("meau.txt", "r"); if (fp == NULL) { printf("无法打开文件!\n"); return; } while (head != NULL) { p = head; head = head->next; free(p); } head = NULL; while (1) { p = (struct meau *)malloc(sizeof(struct meau)); if (p == NULL) { printf("内存分配失败!\n"); fclose(fp); return; } if (fscanf(fp, "%d\t%s\t%d", &p->num, p->name, &p->price) != 3) { free(p); break; } p->next = NULL; if (head == NULL) { head = p; t = p; } else { t->next = p; t = t->next; } } fclose(fp); if (head == NULL) { printf("今日没有提供餐食哦!!\n"); } } int ex(int dishNum) { struct meau *p; for (p = head; p != NULL; p = p->next) { if (p->num == dishNum) { return 1; // 菜品存在 } } return 0; // 菜品不存在 } void order1() { int n, i; int dishNum; struct meau *p; read(); while (1) { printf("请你输入你当前所坐桌的桌号【1~199】:"); scanf("%d", &n); // 检查餐桌号是否有效 if (n < 1 || n >= 200) { printf("*************************************\n"); printf("** 餐桌号无效,请重新输入 **\n"); printf("*************************************\n"); continue; } // 检查餐桌是否已被占用 if (desk1[n].people != 0) { printf("*************************************\n"); printf("** 该餐桌已被占用,请选择其他餐桌 **\n"); printf("*************************************\n"); continue; } break; } printf("请你输入用餐人数:"); scanf("%d", &desk1[n].people); printf("请你输入点菜的个数:"); scanf("%d", &desk1[n].sl); desk1[n].sum = 0; for (i = 0; i < desk1[n].sl; i++) { while (1) { printf("----------------------------------------\n"); printf("第%d个菜品的编码:", i + 1); scanf("%d", &dishNum); if (ex(dishNum)) { desk1[n].grcd[i] = dishNum; for (p = head; p != NULL; p = p->next) { if (p->num == dishNum) { desk1[n].sum += p->price; break; } } break; } else { printf("*************************************\n"); printf("** 菜品编号无效,请重新输入 **\n"); printf("*************************************\n"); } } } printf("\n"); printf("*************************************\n"); printf("** 点餐成功!总金额:%d元 **\n", desk1[n].sum); printf("*************************************\n"); system("pause"); ct(); } void search() { struct meau *p; int n, i; printf("输入当前的所在桌位:"); scanf("%d", &n); if (n < 1 || n >= 200) { printf("*************************************\n"); printf("** 餐桌号无效,请重新输入 **\n"); printf("*************************************\n"); system("pause"); ct(); return; } if (desk1[n].people == 0 || desk1[n].sl == 0) { printf("*************************************\n"); printf("** 该餐桌暂无点餐记录 **\n"); printf("*************************************\n"); system("pause"); ct(); return; } printf("\n"); printf("----------------------------------------\n"); printf("| 餐桌号码 | 用餐人数 | 点菜道数 | 需付金额 |\n"); printf("----------------------------------------\n"); printf("| %4d | %4d | %4d | %6d元 |\n", n, desk1[n].people, desk1[n].sl, desk1[n].sum); printf("----------------------------------------\n"); printf("\n所点菜品:\n"); for (i = 0; i < desk1[n].sl; i++) { int found = 0; for (p = head; p != NULL; p = p->next) { if (desk1[n].grcd[i] == p->num) { printf(" - %s (%d元)\n", p->name, p->price); found = 1; break; } } if (!found) { printf(" - 未知菜品 (编号: %d)\n", desk1[n].grcd[i]); } } printf("\n"); system("pause"); ct(); } void checkout() { int n, i; struct meau *p; printf("请输入需要结账的餐桌号【1~199】:"); scanf("%d", &n); if (n < 1 || n >= 200) { printf("*************************************\n"); printf("** 餐桌号无效,请重新输入 **\n"); printf("*************************************\n"); system("pause"); ad12(); return; } if (desk1[n].people == 0 || desk1[n].sl == 0) { printf("*************************************\n"); printf("** 该餐桌暂无点餐记录 **\n"); printf("*************************************\n"); system("pause"); ad12(); return; } printf("\n"); printf("----------------------------------------\n"); printf("| 餐桌号码 | 用餐人数 | 点菜道数 | 需付金额 |\n"); printf("----------------------------------------\n"); printf("| %4d | %4d | %4d | %6d元 |\n", n, desk1[n].people, desk1[n].sl, desk1[n].sum); printf("----------------------------------------\n"); printf("\n所点菜品:\n"); for (i = 0; i < desk1[n].sl; i++) { for (p = head; p != NULL; p = p->next) { if (desk1[n].grcd[i] == p->num) { printf(" - %s (%d元)\n", p->name, p->price); break; } } } printf("\n是否确认结账?\n"); printf("1. 确认结账\n"); printf("2. 取消\n"); printf("请输入你的选择:"); int choice; scanf("%d", &choice); if (choice == 1) { desk1[n].people = 0; desk1[n].sl = 0; desk1[n].sum = 0; for (i = 0; i < 50; i++) { desk1[n].grcd[i] = 0; } printf("\n"); printf("*************************************\n"); printf("** 结账成功!餐桌 %d 已清空 **\n", n); printf("*************************************\n"); } else { printf("\n"); printf("*************************************\n"); printf("** 结账已取消 **\n"); printf("*************************************\n"); } system("pause"); ad12(); } void chake() { int i; struct meau *p; printf("\n"); printf("========================================\n"); printf("| 所有餐桌订单信息 |\n"); printf("========================================\n"); int Order = 0; for (i = 1; i < 200; i++) { if (desk1[i].people != 0 && desk1[i].sl != 0) { Order = 1; printf("\n"); printf("----------------------------------------\n"); printf("| 餐桌号码 | 用餐人数 | 点菜道数 | 需付金额 |\n"); printf("----------------------------------------\n"); printf("| %4d | %4d | %4d | %6d元 |\n", i, desk1[i].people, desk1[i].sl, desk1[i].sum); printf("----------------------------------------\n"); printf("所点菜品:\n"); for (int j = 0; j < desk1[i].sl; j++) { for (p = head; p != NULL; p = p->next) { if (desk1[i].grcd[j] == p->num) { printf(" - %s (%d元)\n", p->name, p->price); break; } } } } } if (Order == 0) { printf("\n"); printf("*************************************\n"); printf("** 当前没有订单记录 **\n"); printf("*************************************\n"); } printf("\n"); system("pause"); ad12(); }帮我生成思维导图

用MSP430F5529 LauchPad作为是实验板,IAR Embedded Workbench IDE-MSP430为工具,根据要求及下方部分代码完成实验二,给出完整代码。 实验二: 通过对MSP430F5529开发板编程,从IO口产生一个25Hz方波信号,并用AD模块测量该方波信号的峰值幅度值显示于OLED上,要求: 1、利用MSP430定时器和通用IO产生25Hz方波。 2、利用MSP430内部AD测量出该方波峰值幅度并显示在OLED上。 详细要求如下: 1.利用定时器和IO口产生方波 初始化IO口设置,初始化定时器设置并是能中断,编写中断函数内改变IO口的高低电平 2.利用AD测量方波的峰值幅度 设置ADC对应的IO口为复用输入模式,使能参考电压、打开AD转换功能;设置采样时钟源及参数、参考电压大小,使能中断、使能转换,编写ADC12中断函数,在中断函数中读取ADC采样值并对采样值进行转换得到电压实际值。 main.c #include <msp430.h> #include "IIC.h" /********************** PWM波输出端口定义 ***********************/ void init_IO(void) { //指定输出端口选择复用模式 //指定输出端口为输出模式 } /********************* PWM波输出定时器配置 (此代码使用TA0.1输出PWM 由P1.2输出 可自行修改为其他端口) ********************/ int Vpp=0; //幅值 int ccr0= //初始化频率(根据下面的定义自行计算) int ccr1= //初始化占空比 (根据下面定义自行计算) void timer_A0_1_init() //TA0.1输出PWM 由P1.2输出 { //ACLK,增计数 (也可以选择其他时钟源,自行选择) //输出模式7 TA0CCR0 = ccr0; //时钟频率为32768HZ(ACLK) TA0CCR1 = ccr1; //占空比为CCR1/CCR0 } /******************** ADC配置模块 (以下注释配置并不唯一,仅供参考,可以自行选择需要用的寄存器来进行配置) *******************/ void ADC_init() { //AD接入端口复用 //端口输出模式选择为输入 //配置ADC12CTLx使能参考电压 //配置ADC12CTLx打开AD,设置采样时钟 //配置ADC12CTLx配置采样保持、分频系数、时钟源、转换序列 //配置ADC12MCTLx设置参考电压源以及参考电压大小 //配置ADC12IE使能AD中断 //配置ADC12CTLx使能AD转换 } void delayms(int t) //延时t ms { while(t--) { int m=200; while(m--); } } /******************* 计算采样出来的电压值 (提供一种方法,仅供参考,可以自行写) ***************/ int get_Vpp() //得到Vpp { int n; int min=0,max=4095,temp; for(n=0;n<1000;n++) { temp=ADC12MEM0; if(temp<min) min=temp; if(temp>max) max=temp; } return //返回一个计算后的电压值(自行写出计算公式) } void LCD_Show() //LCD显示函数 { LCD_ShowString(8,8,"Vpp=",16); LCD_ShowString(72,8,"mV",16); LCD_ShowNum(40,8,Vpp,4,16); } void init() //初始化 { __enable_interrupt(); init_IO(); timer_A0_1_init(); ADC_init(); LCD_Init(); init_key(); } void main( void ) { WDTCTL = WDTPW + WDTHOLD; //关闭开门狗 init(); //初始化 while(1){ Vpp=get_Vpp(); LCD_Show(); } } 这里是附加的IIC.c代码 #include "msp430.h" #include "IIC.h" #include "font.h" //IIC延时函数 void IIC_delayus(unsigned int i) { unsigned int j,k; for(k=0;k<i;k++) for(j=0;j<4;i++); } //IIC初始化函数 void IIC_ioinit() { P6DIR|=BIT1|BIT5; //配置IIC IO口为输出方向 P6REN|=BIT1|BIT5; //配置IIC IO口使能上拉电阻 } //开始一个IIC通信 void IIC_start() { SCL_HIGH; SDA_HIGH; //IIC_delayus(2); SDA_LOW; //IIC_delayus(2); SCL_LOW; } //停止IIC通信 void IIC_stop() { SCL_LOW; SDA_LOW; //IIC_delayus(2); SCL_HIGH; SDA_HIGH; //IIC_delayus(2); } //IIC发送一个byte void IIC_writebyte(unsigned char IIC_byte) { unsigned char i; for(i=0;i<8;i++) { if(IIC_byte&0x80) SDA_HIGH; else SDA_LOW; SCL_HIGH; SCL_LOW; IIC_byte<<=1; //loop } SDA_HIGH; SCL_HIGH; SCL_LOW; } void IIC_writecmd(unsigned char IIC_command) { IIC_start(); IIC_writebyte(0x78); //Slave address,SA0=0 IIC_writebyte(0x00); //write command IIC_writebyte(IIC_command); IIC_stop(); } void IIC_writedata(unsigned char IIC_data) { IIC_start(); IIC_writebyte(0x78); IIC_writebyte(0x40); //write data IIC_writebyte(IIC_data); IIC_stop(); } /**************************LCD 设置坐标*******************************/ void LCD_Set_Pos(unsigned char x, unsigned char y) { IIC_writecmd(0xb0+y); IIC_writecmd(((x&0xf0)>>4)|0x10); IIC_writecmd((x&0x0f)|0x01); } /***************************LCD复位************************************/ void LCD_CLS(void) { unsigned char y,x; for(y=0;y<8;y++) { IIC_writecmd(0xb0+y); IIC_writecmd(0x01); IIC_writecmd(0x10); for(x=0;x<X_WIDTH;x++) IIC_writedata(0); } } /***************************LCD初始化************************************/ void LCD_Init(void) { IIC_ioinit(); IIC_writecmd(0xAE); //display off IIC_writecmd(0x20); //Set Memory Addressing Mode IIC_writecmd(0x10); //00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid IIC_writecmd(0xb0); //Set Page Start Address for Page Addressing Mode,0-7 IIC_writecmd(0xc8); //Set COM Output Scan Direction IIC_writecmd(0x00);//---set low column address IIC_writecmd(0x10);//---set high column address IIC_writecmd(0x40);//--set start line address IIC_writecmd(0x81);//--set contrast control register IIC_writecmd(0x7f); IIC_writecmd(0xa1);//--set segment re-map 0 to 127 IIC_writecmd(0xa6);//--set normal display IIC_writecmd(0xa8);//--set multiplex ratio(1 to 64) IIC_writecmd(0x3F);// IIC_writecmd(0xa4);//0xa4,Output follows RAM content;0xa5,Output ignores RAM content IIC_writecmd(0xd3);//-set display offset IIC_writecmd(0x00);//-not offset IIC_writecmd(0xd5);//--set display clock divide ratio/oscillator frequency IIC_writecmd(0xf0);//--set divide ratio IIC_writecmd(0xd9);//--set pre-charge period IIC_writecmd(0x22); // IIC_writecmd(0xda);//--set com pins hardware configuration IIC_writecmd(0x12); IIC_writecmd(0xdb);//--set vcomh IIC_writecmd(0x20);//0x20,0.77xVcc IIC_writecmd(0x8d);//--set DC-DC enable IIC_writecmd(0x14);// IIC_writecmd(0xaf);//--turn on oled panel LCD_CLS(); LCD_Set_Pos(0,0); } //在指定位置显示一个字符,包括部分字符 //x:0~127 //y:0~63 //mode:0,反白显示;1,正常显示 //size:选择字体 16/12 void LCD_ShowChar(unsigned char x,unsigned char y,unsigned char chr,unsigned char Char_Size) { unsigned char c=0,i=0; c=chr-' ';//得到偏移后的值 if(x>Max_Column-1) { x=0; y=y+2; } if(Char_Size ==16) { LCD_Set_Pos(x,y); for(i=0;i<8;i++) IIC_writedata(F8X16[c*16+i]); LCD_Set_Pos(x,y+1); for(i=0;i<8;i++) IIC_writedata(F8X16[c*16+i+8]); } else { LCD_Set_Pos(x,y); for(i=0;i<6;i++) IIC_writedata(F6x8[c][i]); } } //显示一个字符号串 void LCD_ShowString(unsigned char x,unsigned char y,unsigned char *chr,unsigned char Char_Size) { unsigned char j=0; while (chr[j]!='\0') { LCD_ShowChar(x,y,chr[j],Char_Size); x+=8; if(x>128) { x=0; y+=2; } j++; } } //m^n函数 unsigned long oled_pow(unsigned char m,unsigned char n) { unsigned long result=1; while(n--)result*=m; return result; } //显示一个数字 void LCD_ShowNum(unsigned char x,unsigned char y,unsigned long num,unsigned char len,unsigned char size2) { unsigned char t,temp; //unsigned char enshow=0; for(t=0;t<len;t++) { temp=(num/oled_pow(10,len-t-1))%10; /*if(enshow==0&&t<(len-1)) { if(temp==0) { LCD_ShowChar(x+(size2/2)*t,y,' ',size2); continue; }else enshow=1; }*/ LCD_ShowChar(x+(size2/2)*t,y,temp+'0',size2); } }

#include<bits/stdc++.h> #define ull unsigned long long using namespace std; const int N=5e5+5; struct info{ int l,r; ull sm[5]; info(){} info(int wl,int wr):l(wl),r(wr){ sm[0]=0;//len sm[1]=0;//a sm[2]=0;//b sm[3]=0;//a*b sm[4]=0;//sum } friend info operator+(info x,info y){ info ans(x.l,y.r); ans.sm[0]=x.sm[0]+y.sm[0]; ans.sm[1]=x.sm[1]+y.sm[1]; ans.sm[2]=x.sm[2]+y.sm[2]; ans.sm[3]=x.sm[3]+y.sm[3]; ans.sm[4]=x.sm[4]+y.sm[4]; return ans; } }; struct tag{ ull z[5][5]; tag(){ for(int i=0;i<=4;++i){ for(int j=0;j<=4;++j){ z[i][j]=0; } z[i][i]=1; } } tag(ull ad,ull bd,ull fu){ for(int i=0;i<=4;++i){ for(int j=0;j<=4;++j){ z[i][j]=0; } z[i][i]=1; } z[0][1]=ad; z[0][2]=bd; z[1][3]=bd; z[2][3]=ad; z[0][3]=ad*bd; z[3][4]=fu; } friend info operator+(info x,tag y){ info ans(x.l,x.r); for(int i=0;i<=4;++i){ for(int j=0;j<=4;++j){ ans.sm[j]+=x.sm[i]*y.z[i][j]; } } return ans; } void operator+=(tag y){ tag x(*this); for(int i=0;i<=4;++i){ for(int j=0;j<=4;++j){ z[i][j]=0; } } for(int i=0;i<=4;++i){ for(int j=i;j<=4;++j){ z[i][j]=x.z[i][0]*y.z[0][j]+x.z[i][1]*y.z[1][j]+x.z[i][2]*y.z[2][j]+x.z[i][3]*y.z[3][j]+x.z[i][4]*y.z[4][j]; } } } }; struct xdtr{ #define cl ((x)*2) #define cr ((x)*2+1) vector<info> a; vector<tag> b; void push_down(int x){ a[cl]=a[cl]+b[x]; b[cl]+=b[x]; a[cr]=a[cr]+b[x]; b[cr]+=b[x]; b[x]=tag(); } void push_up(int x){ a[x]=a[cl]+a[cr]; } void init(int x,int l,int r,info w[]){ if(l==r){ a[x]=w[l]; return; } int mid=(l+r)/2; init(cl,l,mid,w); init(cr,mid+1,r,w); push_up(x); } xdtr(int l,int r,info w[]):a(r*4),b(r*4){ init(1,l,r,w); } tag w; void update(int x,int l,int r){ if((l<=a[x].l)&&(a[x].r<=r)){ a[x]=a[x]+w; b[x]+=w; return; } push_down(x); if(a[cl].r>=l)update(cl,l,r); if(a[cr].l<=r)update(cr,l,r); push_up(x); } void update(int l,int r,tag z){ w=z; update(1,l,r); } info query(int x,int l,int r){ if((l<=a[x].l)&&(a[x].r<=r))return a[x]; push_down(x); if(a[cl].r<l)return query(cr,l,r); if(a[cr].l>r)return query(cl,l,r); return query(cl,l,r)+query(cr,l,r); } }; int n,m; ull a[N]; ull b[N]; info w[N]; pair,int>p[N]; deque >qa,qb; ull ans[N]; int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin>>n>>n; for(int i=1;i<=n;++i)cin>>a[i]; for(int i=1;i<=n;++i)cin>>b[i]; for(int i=1;i<=n;++i)w[i]=info(i,i),w[i].sm[0]=1; xdtr tr(1,n,w); cin>>m; for(int i=1;i<=m;++i){ cin>>p[i].first.second>>p[i].first.first; p[i].second=i; } sort(p+1,p+1+m); for(int i=1,j=1;(i<=n)&&(j<=m);++i){ int la=i,lb=i; while((!qa.empty())&&(a[qa.back().second]<a[i])){ la=qa.back().first; tr.update(qa.back().first,qa.back().second,tag(a[i]-a[qa.back().second],0,0)); qa.pop_back(); } while((!qb.empty())&&(b[qb.back().second]<b[i])){ lb=qb.back().first; tr.update(qb.back().first,qb.back().second,tag(0,b[i]-b[qb.back().second],0)); qb.pop_back(); } tr.update(i,i,tag(a[i],b[i],0)); tr.update(1,n,tag(0,0,1)); qa.push_back(make_pair(la,i)); qb.push_back(make_pair(lb,i)); tr.query(1,1,1); while(p[j].first.first==i){ ans[p[j].second]=tr.query(1,p[j].first.second,p[j].first.first).sm[4]; ++j; if(j>m){ break; } } } for(int i=1;i<=m;++i)cout<<ans[i]<<endl; return 0; }TLE

#include<bits/stdc++.h> #define LL long long #define il inline #define re register #define db double #define eps (1e-5) using namespace std; const int N=500000+10; il LL rd() { LL x=0,w=1;char ch=0; while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();} while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();} return x*w; } #define lc (o<<1) #define rc ((o<<1)|1) #define mid ((l+r)>>1) struct node { int wb[3],las; node(){wb[0]=wb[1]=wb[2]=las=0;} }s[N<<2],nw; il node ad(node a,node b) { node an; an.las=(a.las+b.las)%3; for(int i=0;i<3;i++) an.wb[i]=a.wb[i]+b.wb[(i-a.las+3)%3]; return an; } void bui(int o,int l,int r) { if(l==r) { if(rd()&1) s[o].wb[2-(l&1)]=1,s[o].las=2-(l&1); else s[o].wb[0]=1; return; } bui(lc,l,mid),bui(rc,mid+1,r); s[o]=ad(s[lc],s[rc]); } void modif(int o,int l,int r,int lx) { if(l==r) { if(s[o].las) s[o].wb[2-(l&1)]=s[o].las=0,s[o].wb[0]=1; else s[o].wb[2-(l&1)]=1,s[o].las=2-(l&1),s[o].wb[0]=0; return; } if(lx<=mid) modif(lc,l,mid,lx); else modif(rc,mid+1,r,lx); s[o]=ad(s[lc],s[rc]); } node quer(int o,int l,int r,int ll,int rr) { if(ll<=l&&r<=rr) return s[o]; node a,b; if(ll<=mid) a=quer(lc,l,mid,ll,rr); if(rr>mid) b=quer(rc,mid+1,r,ll,rr); return ad(a,b); } int n,m; LL ans; int main() { n=rd(),m=rd(); bui(1,1,n); while(m--) { int op=rd(); if(op&1) modif(1,1,n,rd()); else { ans=0; int l=rd(),r=rd(); nw=quer(1,1,n,l,r);++nw.wb[0]; ans=1ll*nw.wb[0]*(nw.wb[0]-1)/2+1ll*nw.wb[1]*(nw.wb[1]-1)/2+1ll*nw.wb[2]*(nw.wb[2]-1)/2; printf("%lld\n",ans); } } return 0; }详解每一行代码什么意思并代表什么含义

#include<bits/stdc++.h> #define ll long long using namespace std; const int N=1e5+5; template<class info,class tag> class xdtr{ public: #define cl (x*2) #define cr (x*2+1) info a[N*4]; tag b[N*4]; void push_down(int x){ a[cl]=a[cl]+b[x]; a[cr]=a[cr]+b[x]; b[x]=tag(); } void push_up(int x){ a[x]=a[cl]+a[cr]; } void init(int x,int l,int r,info w[]){ if(l==r){ a[x]=w[l]; return; } int mid=(l+r)/2; init(cl,l,mid,w); init(cr,mid+1,r,w); push_up(x); } xdtr(int l,int r,info w[]){ init(1,l,r,w); } void update(int x,int l,int r,tag w){ if((l<=a[x].l)&&(a[x].r<=r)){ a[x]=a[x]+w; b[x]=b[x]+w; return; } push_down(x); if(a[cl].r>=l){ update(cl,l,r,w); } if(a[cr].l<=r){ update(cr,l,r,w); } push_up(x); } info query(int x,int l,int r){ if((l<=a[x].l)&&(a[x].r<=r)){ return a[x]; } push_down(x); if(a[cl].r<l){ return query(cr,l,r); } if(a[cr].l>r){ return query(cl,l,r); } return query(cl,l,r)+query(cr,l,r); } }; class tag1; class info1{ public: int l,r; int mx,mxl; info1(int wl=0,int wr=0,int wmx=0,int wmxl=0){ l=wl; r=wr; mx=wmx; mxl=wmxl; } friend info1 operator+(info1 a,info1 b){ return info1( a.l, b.r, max(a.mx,b.mx), max(a.mxl,b.mxl) ); } friend info1 operator+(info1,tag1); }; class tag1{ public: int ad,adl; bool tnf; int tn,tnl; tag1(int wad=0,int wadl=0,bool wtnf=0,int wtn=0,int wtnl=0){ ad=wad; adl=wadl; tnf=wtnf; tn=wtn; tnl=wtnl; } friend info1 operator+(info1 a,tag1 b){ if(b.tnf==0){ return info1( a.l, a.r, a.mx+b.ad, max(a.mxl,a.mx+b.adl) ); }else{ return info1( a.l, a.r, b.tn, max(max(a.mxl,a.mx+b.adl),b.tnl) ); } } friend tag1 operator+(tag1 a,tag1 b){ if((a.tnf==0)&&(b.tnf==0)){ return tag1( a.ad+b.ad, max(a.adl,a.ad+a.adl) ); }else if((a.tnf==1)&&(b.tnf==0)){ return tag1( 0, a.adl, 1, a.tn+b.ad, max(a.tnl,a.tn+b.adl) ); }else if((a.tnf==0)&&(b.tnf==1)){ return tag1( 0, max(a.adl,a.ad+a.adl), 1, b.tn, b.tnl ); }else{ return tag1( 0, a.adl, 1, b.tn, max(max(a.tnl,a.tn+b.adl),b.tnl) ); } } }; int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n; info1 a[N]; cin>>n; for(int i=1;i<=n;++i){ int x; cin>>x; a[i]=info1(i,i,x,x); } xdtr<info1,tag1>tr(1,n,a); int T; cin>>T; while(T--){ char op; cin>>op; if(op=='Q'){ int l,r; cin>>l>>r; cout<<tr.query(1,l,r).mx<<endl; }else if(op=='A'){ int l,r; cin>>l>>r; cout<<tr.query(1,l,r).mxl<<endl; }else if(op=='P'){ int l,r,x; cin>>l>>r>>x; tr.update(1,l,r,tag1(x,max(x,0))); }else{ int l,r,x; cin>>l>>r>>x; tr.update(1,l,r,tag1(0,0,1,x,x)); } } return 0; }RE 错误

最新推荐

recommend-type

双向CLLLC谐振闭环仿真设计与软开关技术实现:高压侧与低压侧波形优化及软开关性能研究 · 谐振波形优化

内容概要:本文介绍了双向CLLLC谐振技术及其在电力电子领域的应用,重点讨论了软开关和谐振波形的优化设计。文中首先简述了CLLLC谐振技术的基本原理,然后详细描述了在一个仿真环境下构建的双向CLLLC谐振系统,该系统能够在广泛的电压范围内(高压侧380-430V,低压侧40-54V)实现过谐振、欠谐振及满载轻载情况下的软开关。此外,文章展示了理想的谐振波形,并强调了软开关对减少开关损耗和电磁干扰的重要性。最后,文章提到可以通过参考相关文献深入了解系统的电路设计、控制策略和参数优化。 适合人群:从事电力电子设计的研究人员和技术工程师。 使用场景及目标:适用于需要理解和掌握双向CLLLC谐振技术及其仿真设计的专业人士,旨在帮助他们提升电源转换和能量回收系统的性能。 其他说明:文中提供的代码片段和图示均为假设的仿真环境,实际应用时需根据具体情况调整。建议参考相关文献获取更详尽的设计细节。
recommend-type

操作系统原理-PPT(1).ppt

操作系统原理-PPT(1).ppt
recommend-type

精选Java案例开发技巧集锦

从提供的文件信息中,我们可以看出,这是一份关于Java案例开发的集合。虽然没有具体的文件名称列表内容,但根据标题和描述,我们可以推断出这是一份包含了多个Java编程案例的开发集锦。下面我将详细说明与Java案例开发相关的一些知识点。 首先,Java案例开发涉及的知识点相当广泛,它不仅包括了Java语言的基础知识,还包括了面向对象编程思想、数据结构、算法、软件工程原理、设计模式以及特定的开发工具和环境等。 ### Java基础知识 - **Java语言特性**:Java是一种面向对象、解释执行、健壮性、安全性、平台无关性的高级编程语言。 - **数据类型**:Java中的数据类型包括基本数据类型(int、short、long、byte、float、double、boolean、char)和引用数据类型(类、接口、数组)。 - **控制结构**:包括if、else、switch、for、while、do-while等条件和循环控制结构。 - **数组和字符串**:Java数组的定义、初始化和多维数组的使用;字符串的创建、处理和String类的常用方法。 - **异常处理**:try、catch、finally以及throw和throws的使用,用以处理程序中的异常情况。 - **类和对象**:类的定义、对象的创建和使用,以及对象之间的交互。 - **继承和多态**:通过extends关键字实现类的继承,以及通过抽象类和接口实现多态。 ### 面向对象编程 - **封装、继承、多态**:是面向对象编程(OOP)的三大特征,也是Java编程中实现代码复用和模块化的主要手段。 - **抽象类和接口**:抽象类和接口的定义和使用,以及它们在实现多态中的不同应用场景。 ### Java高级特性 - **集合框架**:List、Set、Map等集合类的使用,以及迭代器和比较器的使用。 - **泛型编程**:泛型类、接口和方法的定义和使用,以及类型擦除和通配符的应用。 - **多线程和并发**:创建和管理线程的方法,synchronized和volatile关键字的使用,以及并发包中的类如Executor和ConcurrentMap的应用。 - **I/O流**:文件I/O、字节流、字符流、缓冲流、对象序列化的使用和原理。 - **网络编程**:基于Socket编程,使用java.net包下的类进行网络通信。 - **Java内存模型**:理解堆、栈、方法区等内存区域的作用以及垃圾回收机制。 ### Java开发工具和环境 - **集成开发环境(IDE)**:如Eclipse、IntelliJ IDEA等,它们提供了代码编辑、编译、调试等功能。 - **构建工具**:如Maven和Gradle,它们用于项目构建、依赖管理以及自动化构建过程。 - **版本控制工具**:如Git和SVN,用于代码的版本控制和团队协作。 ### 设计模式和软件工程原理 - **设计模式**:如单例、工厂、策略、观察者、装饰者等设计模式,在Java开发中如何应用这些模式来提高代码的可维护性和可扩展性。 - **软件工程原理**:包括软件开发流程、项目管理、代码审查、单元测试等。 ### 实际案例开发 - **项目结构和构建**:了解如何组织Java项目文件,合理使用包和模块化结构。 - **需求分析和设计**:明确项目需求,进行系统设计,如数据库设计、系统架构设计等。 - **代码编写和实现**:根据设计编写符合要求的代码,实现系统的各个模块功能。 - **测试和维护**:进行单元测试、集成测试,确保代码质量,对项目进行维护和升级。 ### 其他相关知识点 - **Java虚拟机(JVM)**:了解JVM的基本工作原理,包括类加载机制、内存管理、垃圾回收算法等。 - **常用Java框架**:比如Spring、Hibernate、MyBatis等,在实际开发中常常与Java基础结合使用,提高开发效率。 以上知识点可以作为学习Java案例开发的基础框架。在实际的开发实践中,开发者需要结合具体的项目需求,对这些知识点进行灵活运用。通过反复的案例实践,可以加深对Java编程的理解,并逐步提升开发技能。这份集锦可能包含的案例可能涉及上述知识点的具体应用,能够帮助学习者更好地理解理论与实践的结合,从而快速提升个人的Java开发能力。
recommend-type

【VASP报错深度解析】:5大技巧识别并永久解决离子距离太近警告

# 1. VASP软件简介及离子距离太近问题概述 ## 1.1 VASP软件简介 **VASP(Vienna Ab initio Simulation Package)** 是一款广泛应用于计算材料科学的软件,它基于密度泛函理论(DFT)计算固体、表面和分子的电子结构和性质。
recommend-type

npm error A complete log of this run can be found in: D:\Program Files\nodejs\node_cache\_logs\2025-04-20T15_11_51_454Z-debug-0.log

<think>好的,我需要帮助用户找到npm的错误调试日志位置,并解决他们遇到的npm错误。首先,用户已经提供了一个具体的日志路径:'D:\Program Files\nodejs\node_cache\_logs\2025-04-20T15_11_51_454Z-debug-0.log',但看起来这个路径可能有问题,因为日期是2025年,这可能是一个示例或输入错误。我需要确认正确的日志路径生成方式。 根据npm的默认配置,日志文件通常位于npm的缓存目录下的_logs文件夹中。默认情况下,Windows系统中npm的缓存路径是%AppData%\npm-cache,而日志文件会以当前日期和
recommend-type

深入理解内存技术文档详解

由于文件内容无法查看,仅能根据文件的标题、描述、标签以及文件名称列表来构建相关知识点。以下是对“内存详解”这一主题的详细知识点梳理。 内存,作为计算机硬件的重要组成部分,负责临时存放CPU处理的数据和指令。理解内存的工作原理、类型、性能参数等对优化计算机系统性能至关重要。本知识点将从以下几个方面来详细介绍内存: 1. 内存基础概念 内存(Random Access Memory,RAM)是易失性存储器,这意味着一旦断电,存储在其中的数据将会丢失。内存允许计算机临时存储正在执行的程序和数据,以便CPU可以快速访问这些信息。 2. 内存类型 - 动态随机存取存储器(DRAM):目前最常见的RAM类型,用于大多数个人电脑和服务器。 - 静态随机存取存储器(SRAM):速度较快,通常用作CPU缓存。 - 同步动态随机存取存储器(SDRAM):在时钟信号的同步下工作的DRAM。 - 双倍数据速率同步动态随机存取存储器(DDR SDRAM):在时钟周期的上升沿和下降沿传输数据,大幅提升了内存的传输速率。 3. 内存组成结构 - 存储单元:由存储位构成的最小数据存储单位。 - 地址总线:用于选择内存中的存储单元。 - 数据总线:用于传输数据。 - 控制总线:用于传输控制信号。 4. 内存性能参数 - 存储容量:通常用MB(兆字节)或GB(吉字节)表示,指的是内存能够存储多少数据。 - 内存时序:指的是内存从接受到请求到开始读取数据之间的时间间隔。 - 内存频率:通常以MHz或GHz为单位,是内存传输数据的速度。 - 内存带宽:数据传输速率,通常以字节/秒为单位,直接关联到内存频率和数据位宽。 5. 内存工作原理 内存基于电容器和晶体管的工作原理,电容器存储电荷来表示1或0的状态,晶体管则用于读取或写入数据。为了保持数据不丢失,动态内存需要定期刷新。 6. 内存插槽与安装 - 计算机主板上有专用的内存插槽,常见的有DDR2、DDR3、DDR4和DDR5等不同类型。 - 安装内存时需确保兼容性,并按照正确的方向插入内存条,避免物理损坏。 7. 内存测试与优化 - 测试:可以使用如MemTest86等工具测试内存的稳定性和故障。 - 优化:通过超频来提高内存频率,但必须确保稳定性,否则会导致数据损坏或系统崩溃。 8. 内存兼容性问题 不同内存条可能由于制造商、工作频率、时序、电压等参数的不匹配而产生兼容性问题。在升级或更换内存时,必须检查其与主板和现有系统的兼容性。 9. 内存条的常见品牌与型号 诸如金士顿(Kingston)、海盗船(Corsair)、三星(Samsung)和芝奇(G.Skill)等知名品牌提供多种型号的内存条,针对不同需求的用户。 由于“内存详解.doc”是文件标题指定的文件内容,我们可以预期在该文档中将详细涵盖以上知识点,并有可能包含更多的实践案例、故障排查方法以及内存技术的最新发展等高级内容。在实际工作中,理解并应用这些内存相关的知识点对于提高计算机性能、解决计算机故障有着不可估量的价值。
recommend-type

【机械特性分析进阶秘籍】:频域与时域对比的全面研究

# 1. 机械特性分析的频域与时域概述 ## 1.1 频域与时域分析的基本概念 机械特性分析是通
recommend-type

dslicsrv安装报错Too many errors

<think>好的,用户遇到了安装dslicsrv时出现“Too many errors”的问题,需要帮助解决。首先,我需要明确dslicsrv是什么。可能是指某个特定的软件服务,但根据常见软件库和搜索引擎的信息,没有直接对应的结果。可能是拼写错误,或者是某个特定领域的专有软件?比如,可能与Dell的某个服务有关?例如,Dell System License Manager Service(dsLicSvc)可能更接近。假设用户可能拼写错误,将dslicsrv理解为dsLicSvc,即Dell的系统许可证管理服务。 接下来,用户遇到的错误是安装时出现“Too many errors”,这通常
recommend-type

深入解析Pro Ajax与Java技术的综合应用框架

根据提供的文件信息,我们可以推断出一系列与标题《Pro Ajax and Java》相关的IT知识点。这本书是由Apress出版,关注的是Ajax和Java技术。下面我将详细介绍这些知识点。 ### Ajax技术 Ajax(Asynchronous JavaScript and XML)是一种无需重新加载整个页面即可更新网页的技术。它通过在后台与服务器进行少量数据交换,实现了异步更新网页内容的目的。 1. **异步通信**:Ajax的核心是通过XMLHttpRequest对象或者现代的Fetch API等技术实现浏览器与服务器的异步通信。 2. **DOM操作**:利用JavaScript操作文档对象模型(DOM),能够实现页面内容的动态更新,而无需重新加载整个页面。 3. **数据交换格式**:Ajax通信中常使用的数据格式包括XML和JSON,但近年来JSON因其轻量级和易用性更受青睐。 4. **跨浏览器兼容性**:由于历史原因,实现Ajax的JavaScript代码需要考虑不同浏览器的兼容性问题。 5. **框架和库**:有许多流行的JavaScript库和框架支持Ajax开发,如jQuery、Dojo、ExtJS等,这些工具简化了Ajax的实现和数据操作。 ### Java技术 Java是一种广泛使用的面向对象编程语言,其在企业级应用、移动应用开发(Android)、Web应用开发等方面有着广泛应用。 1. **Java虚拟机(JVM)**:Java程序运行在Java虚拟机上,这使得Java具有良好的跨平台性。 2. **Java标准版(Java SE)**:包含了Java的核心类库和API,是Java应用开发的基础。 3. **Java企业版(Java EE)**:为企业级应用提供了额外的API和服务,如Java Servlet、JavaServer Pages(JSP)、Enterprise JavaBeans(EJB)等。 4. **面向对象编程(OOP)**:Java是一种纯粹的面向对象语言,它的语法和机制支持封装、继承和多态性。 5. **社区和生态系统**:Java拥有庞大的开发者社区和丰富的第三方库和框架,如Spring、Hibernate等,这些资源极大丰富了Java的应用范围。 ### 结合Ajax和Java 在结合使用Ajax和Java进行开发时,我们通常会采用MVC(模型-视图-控制器)架构模式,来构建可维护和可扩展的应用程序。 1. **服务器端技术**:Java经常被用来构建服务器端应用逻辑。例如,使用Servlet来处理客户端的请求,再将数据以Ajax请求的响应形式返回给客户端。 2. **客户端技术**:客户端的JavaScript(或使用框架库如jQuery)用于发起Ajax请求,并更新页面内容。 3. **数据格式**:Java后端通常会使用JSON或XML格式与Ajax进行数据交换。 4. **安全性**:Ajax请求可能涉及敏感数据,因此需要考虑如跨站请求伪造(CSRF)等安全问题。 5. **性能优化**:合理使用Ajax可以提升用户体验,但同时也需要注意对服务器和网络的负载,以及客户端脚本的执行性能。 ### 出版信息及文件信息 《Pro Ajax and Java》由Apress出版社出版,通常这种出版物会包含丰富的实例代码、开发指导、最佳实践以及相关的技术讨论。它旨在帮助开发者深化对Ajax和Java技术的理解和应用能力。 文件名“Apress.Pro.Ajax.and.Java.Frameworks.Jul.2006.HAPPY.NEW.YEAR.pdf”暗示了这份文档可能是一本专业的技术书籍。从文件名可以看出,该书还可能包含了框架使用方面的内容,并且是2006年出版的。标题中的“HAPPY.NEW.YEAR”可能仅仅是为了庆祝新年而加入的非标准部分。 总结而言,了解Ajax和Java的结合使用,不仅需要掌握两种技术的基本原理和使用方法,还要熟悉如何将它们整合到实际项目中,解决可能出现的技术挑战,从而构建功能强大且用户友好的Web应用。
recommend-type

【频域分析深度解读】:揭秘机械系统分析中的实用应用

# 1. 频域分析基础理论 频域分析是信号处理领域的一个重要分支,其核心在于研究信号在频率维度上的特性。与时域分析不同,频域分析关注的是信号频率成分的组成,这允许我们以一种直观的方式识别和处理信号中的特定频率特征。通过对信号进行傅里叶变换,原始的时域信号可以被转换为频域信号,这样就可以清晰地显示出各频率成分的幅度和相位信息。这种分析手段对于信号去噪、特征提取、压缩编码等应用场景至关重